首页 > 代码库 > DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf

DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf

DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf

 

DYNAMIC_DOWNCAST(class, pointer ):如果pointer指针所指向的对象是class类型的,就返回这个指针。否则返回NULL

例如 你获取到一个指针 XXX *pointer; 你想判断它是不是指向某个类 ,例如 A 这个类

A* p= DYNAMIC_DOWNCAST(A, pointer );

如果pointer是指向A这个类则返回此指针,否则返回空

 

CRuntimeClass和IsKindOf的关系

CRuntimeClass在MFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从A到B的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。

 

动态确定类

   在MFC中

BOOL CObject::IsKindOf(   

       const CRuntimeClass* pClass  

               ) const;

利用CRuntimeClass来进行判定,如果你生成的类是以CFrameWnd为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。

-----------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

#include <afxwin.h>

 

 

class Type1: public CObject {};        //类型一,从CObject派生

class Type2: public CFrameWnd {};    //类型二,从CFrameWnd派生

 

BOOL IsType1(CObject *pFrameWnd)    //判断函数

{

     return pFrameWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd));    //判断是不是CFrameWnd的类型,请注意这里的蓝色字体

}

BOOL IsType2(CObject *pObject)

{

    return pObject->IsKindOf(RUNTIME_CLASS(CObject));    //判断是不是CObject类型

}

 

 

int main()

{

     Type1 t1;

     Type2 t2;

     ASSERT(IsType1(&t1) == FALSE);    //返回假.因为t1不对应CFrameWnd的类型

     ASSERT(IsType1(&t2) == TRUE);     //正确.t2对应CFrameWnd的类型

    ASSERT(IsType2(&t1) == TRUE);    //t1就是从CObject派生

    ASSERT(IsType2(&t2) == TRUE);    //t2也是从CObject派生   

     return 0;

}

 

 

STATIC_DOWNCAST

例如 CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);

If  pYourDoc does not point to a CDocument object, the macro will ASSERT.

STATIC_DOWNCAST将指向一个类的对象的指针转换为另一个相关类型的指针。在调试版本中,如果该对象不能转换为目标类型,会引起ASSERT。

DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf