存取 Run-time 類別資訊
本文說明如何存取執行階段物件之類別有關的資訊。
注意事項 |
---|
MFC 不會使用執行階段型別資訊 (RTTI) 支援 Visual C++ 4.0 中介紹。 |
如果您有衍生類別中的 CObject ,使用 DECLARE_動態和IMPLEMENT_DYNAMIC、 DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,或DECLARE_SERIAL和IMPLEMENT_SERIAL解釋文件中的巨集衍生、 cobject 的類別、 CObject類別都能夠在執行階段決定物件的確切的類別。
需要額外的型別檢查函式引數時,您必須撰寫特殊用途的物件類別為基礎的程式碼時,這項功能十分實用。 不過,這種作法通常建議您不要因為它會複製虛擬函式的功能。
CObject成員函式IsKindOf可用來判定特定的物件屬於指定的類別,或如果它衍生自特定類別。 引數為IsKindOf是CRuntimeClass物件,您可以取得使用RUNTIME_CLASS巨集與類別的名稱。
若要使用 RUNTIME_CLASS 巨集
使用RUNTIME_CLASS類別,如下所示為類別的名稱與CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
您通常不需要直接存取執行階段類別物件。 較常見的用法是傳遞至執行階段類別物件IsKindOf有作用下, 一個程序中所示。 IsKindOf函式會測試以查看是否屬於特定類別的物件。
若要使用 IsKindOf 函式
請確定類別的執行階段類別支援。 也就是該類別必須有已直接或間接衍生自CObject ,使用 DECLARE_動態和IMPLEMENT_DYNAMIC、 DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE,或DECLARE_SERIAL和IMPLEMENT_SERIAL解釋文件中的巨集衍生、 cobject 的類別。
呼叫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 類別衍生,如有必要。
Run-time 類別資訊的另一個用途是動態建立的物件。 這項程序發行項中所提及動態物件建立。
如需詳細資訊的序列化,以及 run-time 類別資訊,請參閱文章檔案,在 MFC 中的 和 序列化。