- /*
- 這篇小短文告訴我們如何在運行時取得一個類對象的信息
- 如果你是從類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;
- }
訪問運行時類的信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.