DYNAMIC_DOWNCAST STATIC_DOWNCAST IsKindOf

 

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

pwnd 你获取到的指针

class 你的类

class A;

例如 你获取到一个指针 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 Type1public CObject {};        //类型一,从CObject派生

class Type2public 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

强制转换为指向 CYourDocument,称为 pYourDoc 是指向 CDocument 使用下面的表达式的指针的指针:  

CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);

posted @ 2011-12-16 10:03  bigbigtree  阅读(399)  评论(0编辑  收藏  举报