2012-08-25 07:01
⁄ 工业·编程
⁄ 共 1512字 ⁄ 字号
小 中 大
- 这篇小短文告诉我们如何在运行时取得一个类对象的信息
- 如果你是从类CObject派生的类且还使用了宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,
- DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE或者DECLARE_SERIAL和IMPLEMENT_SERIAL,
- 那么CObject就可以在运行时检查一个类对象所属的具体类。
- 当你想检查一个函数参数的具体类型或者想针对一个特殊类编写一些特殊的代码时,
- 这个功能是很有用的。
- CObject的成员方法IsKindOf可用于检查一个对象是否属于指定的类或者它是否派生
- 于指定的类。IsKindOf的参数是一个CRuntimeClass对象,我们可以使用宏
- RUNTIME_CLASS(class name)的方式获得。
- */
- /*
- 使用RUNTIME_CLASS宏的例子
- 一般情况下,我们没有必要直接访问CRuntimeClass,其比较常用的功能是作为
- IsKindOf的参数,以检查具体类。
- */
- CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
- /*
- 使用IsKindOf的例子
- 注意
- 要确保要检查的类具体运行时识别功能,即它是直接或间接的从CObject
- 派生且使用了宏DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,
- DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE或者DECLARE_SERIAL和IMPLEMENT_SERIAL
- 如果被检查的对象属于指定的类,IsKindOf会返回TRUE。
- IsKindOf不支持多继承或虚基类。
- */
- class CPerson : public CObject
- {
- DECLARE_DYNAMIC( CPerson )
- // other declarations
- };
- IMPLEMENT_DYNAMIC( CPerson, CObject )
- IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)
- void MemoryCorruptingSnippet(bool bCorrupt)
- {
- if (bCorrupt)
- {
- CAge* pcage = new CAge(21); // CAge is derived from CObject.
- Age* page = new Age(22); // Age is NOT derived from CObject.
- *(((char*)pcage) - 1) = 99; // Corrupt preceding guard byte
- *(((char*)page) - 1) = 99; // Corrupt preceding guard byte
- AfxCheckMemory();
- }
- }
- void SomeFunction(void)
- {
- CObject* pMyObject = new CPerson;
- if(NULL != pMyObject &
- pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) )
- {
- //if IsKindOf is true, then cast is all right
- CPerson* pmyPerson = (CPerson*) pMyObject ;
- pmyPerson->AssertValid();
- // other code goes here...
- }
- delete pMyObject;
- }