|
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后方可生效。 |
CRuntimeClass的应用
最新推荐文章于 2022-07-12 20:28:54 发布