首页 > 代码库 > 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