共用方式為


存取 Run-time 類別資訊

本文說明如何存取執行階段物件之類別有關的資訊。

注意事項注意事項

MFC 不會使用執行階段型別資訊 (RTTI) 支援 Visual C++ 4.0 中介紹。

如果您有衍生類別中的 CObject ,使用 DECLARE_動態IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE,或DECLARE_SERIALIMPLEMENT_SERIAL解釋文件中的巨集衍生、 cobject 的類別CObject類別都能夠在執行階段決定物件的確切的類別。

需要額外的型別檢查函式引數時,您必須撰寫特殊用途的物件類別為基礎的程式碼時,這項功能十分實用。 不過,這種作法通常建議您不要因為它會複製虛擬函式的功能。

CObject成員函式IsKindOf可用來判定特定的物件屬於指定的類別,或如果它衍生自特定類別。 引數為IsKindOfCRuntimeClass物件,您可以取得使用RUNTIME_CLASS巨集與類別的名稱。

若要使用 RUNTIME_CLASS 巨集

  • 使用RUNTIME_CLASS類別,如下所示為類別的名稱與CObject

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );   
    

您通常不需要直接存取執行階段類別物件。 較常見的用法是傳遞至執行階段類別物件IsKindOf有作用下, 一個程序中所示。 IsKindOf函式會測試以查看是否屬於特定類別的物件。

若要使用 IsKindOf 函式

  1. 請確定類別的執行階段類別支援。 也就是該類別必須有已直接或間接衍生自CObject ,使用 DECLARE_動態IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE,或DECLARE_SERIALIMPLEMENT_SERIAL解釋文件中的巨集衍生、 cobject 的類別

  2. 呼叫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 中的序列化

請參閱

概念

使用 CObject