CRuntimeClass
在
MFC
中的作用很重要,因为
MFC
利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从
A
到
B
的转换导致错误。而在
MFC
的各种书籍中对
CRuntimeClass
的介绍是比较少的,在这里总结它的一些用法。
1
、动态确定类
在
MFC
中
CObject::IsKindOf( const CRuntimeClass* pClass )
利用
CRuntimeClass
来进行判定,如果你生成的类是以
CObject
为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。
class CAge:public CObject
BOOL IsAge(CObject* pO)
{
return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
}
BOOL IsAge2(CAge* pO)
{
return pO->IsKindOf( RUNTIME_CLASS( CAge ) );
}
void main(void)
{
CObject a;
CAge b;
IsAge(&a);//return FALSE
IsAge(&b);//return TRUE
IsAge2((CAge*)&a);//return FALSE,
避免强制转换带来的错误
}
2
、生成类
CObject CRuntimeClass::CreateObject(void)
可以产生一个类变量。作用和
new
类似,但在某些特殊场合有独特的作用。下面举一个例子来加深了解。
假定有以下几个类定义
class CWndA: public CWnd
class CWndB: public CWnd
function1()
{
CRuntimeClass* pC=RUNTIME_CLASS( CWndA );
CreateWnd(pC);
}
CWnd* CreateWnd(CRuntimeClass* pClass)
{
return (CWnd*)pClass->CreateObject();
}
在上面例子中,
CreateWnd
返回的是
CWnd*
其实它是一个
CWndA*
。你可以进行由父类到子类的强制转换而不必要担心出错。使用
CRuntimeClass
可以代替使用
switch
生产类实例的一些繁琐。(请好好想想它的用途,当你发现它的好处时,你一定会大吃一惊,
M$
使用宏来实现类的动态检测,如果谁有兴趣可以去看看
MFC
的源代码。)
注意:在类的定义中使用
IMPLEMENT_DYNCREATE
后方可生效。