存取執行階段類別資訊
本文說明如何在執行階段存取物件之類別的資訊。
注意
MFC 不會使用 Visual C++ 4.0 中引進的執行時間類型資訊 (RTTI) 支援。
如果您已從 CObject 衍生類別,並使用 DECLARE _ DYNAMIC 和 IMPLEMENT_DYNAMIC
、 DECLARE_DYNCREATE
和 IMPLEMENT_DYNCREATE
,或 DECLARE_SERIAL
從 CObject 衍生類別一文 中說明的 和 IMPLEMENT_SERIAL
宏,類別 CObject
就能夠判斷執行時間物件的確切類別。
當需要檢查函式引數的實際類型時,以及當您必須根據物件的類別撰寫特殊用途的程式碼時,這項功能十分實用。 不過,通常不建議使用這種作法,因為這會使虛擬函式的功能重複。
CObject
成員函式 IsKindOf
可以用來判斷特定物件是否屬於指定的類別,或是否衍生自特定類別。 IsKindOf
的引數是一個 CRuntimeClass
物件,您可以使用 RUNTIME_CLASS
巨集透過類別的名稱來取得該物件。
使用 RUNTIME_CLASS 巨集
針對
RUNTIME_CLASS
類別使用CObject
與類別名稱,如下所示:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
您很少需要直接存取執行階段類別物件。 一般用法是將執行階段類別物件傳遞至 IsKindOf
函式,如下一個程序所示。 IsKindOf
函式會測試物件是否屬於特定類別。
使用 IsKindOf 函式
請確定類別支援執行階段類別。 也就是說,類別必須直接或間接衍生自
CObject
,並使用 DECLARE _ DYNAMIC 和IMPLEMENT_DYNAMIC
、DECLARE_DYNCREATE
和IMPLEMENT_DYNCREATE
,或DECLARE_SERIAL
從 CObject 衍生類別一文 中說明的 和IMPLEMENT_SERIAL
宏。呼叫該類別之物件的
IsKindOf
成員函式,使用RUNTIME_CLASS
巨集產生CRuntimeClass
引數,如下所示: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; }
注意
如果物件是指定類別的成員或衍生自指定類別的類別,則 IsKindOf 會傳回 TRUE 。
IsKindOf
不支援多重繼承或虛擬基底類別,不過您可以視需要為衍生的 MFC 使用多重繼承。
執行階段類別資訊的其中一種用途是動態建立物件。 此程式會在動態物件建立 一文 中討論。
如需序列化和執行時間類別資訊的詳細資訊,請參閱 MFC 和序列化 中的檔案文章 。