共用方式為


存取執行階段類別資訊

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

注意

MFC 不會使用 Visual C++ 4.0 中引進的執行時間類型資訊 (RTTI) 支援。

如果您已從 CObject 衍生類別,並使用 DECLARE _ DYNAMIC IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE ,或 DECLARE_SERIAL 從 CObject 衍生類別一文 中說明的 和 IMPLEMENT_SERIAL 宏,類別 CObject 就能夠判斷執行時間物件的確切類別。

當需要檢查函式引數的實際類型時,以及當您必須根據物件的類別撰寫特殊用途的程式碼時,這項功能十分實用。 不過,通常不建議使用這種作法,因為這會使虛擬函式的功能重複。

CObject 成員函式 IsKindOf 可以用來判斷特定物件是否屬於指定的類別,或是否衍生自特定類別。 IsKindOf 的引數是一個 CRuntimeClass 物件,您可以使用 RUNTIME_CLASS 巨集透過類別的名稱來取得該物件。

使用 RUNTIME_CLASS 巨集

  1. 針對 RUNTIME_CLASS 類別使用 CObject 與類別名稱,如下所示:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

您很少需要直接存取執行階段類別物件。 一般用法是將執行階段類別物件傳遞至 IsKindOf 函式,如下一個程序所示。 IsKindOf 函式會測試物件是否屬於特定類別。

使用 IsKindOf 函式

  1. 請確定類別支援執行階段類別。 也就是說,類別必須直接或間接衍生自 CObject ,並使用 DECLARE _ DYNAMIC IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE ,或 DECLARE_SERIAL 從 CObject 衍生類別一文 中說明的 和 IMPLEMENT_SERIAL 宏。

  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 使用多重繼承。

執行階段類別資訊的其中一種用途是動態建立物件。 此程式會在動態物件建立 一文 中討論。

如需序列化和執行時間類別資訊的詳細資訊,請參閱 MFC 和序列化 中的檔案文章

另請參閱

使用 CObject