Freigeben über


Zugreifen auf Laufzeit-Klasseninformationen

Dieser Artikel beschreibt z auf Informationen über die Klasse eines Objekts zur Laufzeit.

Hinweis

MFC verwendet keine Unterstützung Laufzeit-Typeninformationen (RTTI), die in Visual C++ 4.0 eingeführt wurde.

Wenn Sie die Klasse von CObject abgeleitet und das DEKLARIEREN_DYNAMISCH und IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE oder die DECLARE_SERIAL und IMPLEMENT_SERIAL, die Makros im Artikel Ableiten einer Klasse von CObject erläutert werden verwendet haben, hat die CObject-Klasse die Möglichkeit, die genauen Klasse eines Objekts zur Laufzeit zu bestimmen.

Diese Fähigkeit ist besonders hilfreich, wenn zusätzliche Typüberprüfung von Funktionsargumenten erforderlich ist und wenn Sie für besondere Zwecke auf Grundlage der Klasse eines Objekts müssen Code schreiben. Davon wird jedoch normalerweise nicht empfohlen, da dies die Funktionalität von virtuellen Funktionen dupliziert.

Die CObject-Memberfunktion IsKindOf kann verwendet werden, um zu bestimmen, ob ein bestimmtes Objekt einer angegebenen Klasse gehört, oder wenn von einer bestimmten Klasse abgeleitet ist. Das Argument für IsKindOf ist ein CRuntimeClass-Objekt, das Sie mithilfe des RUNTIME_CLASS-Makros mit dem Namen der Klasse abrufen können.

Um das RUNTIME_CLASS-Makro verwenden

  • Verwenden Sie RUNTIME_CLASS mit dem Namen der Klasse, wie hier gezeigt für die Klasse CObject:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );    
    

Sie müssen selten auf das Ablaufklassenobjekt direkt zugreifen. Eine weitere allgemeine Verwendung besteht, das IsKindOf Ablaufklassenobjekt zur Funktion, wie im folgenden Verfahren dargestellt zu übergeben. Die IsKindOf-Funktionstests ein Objekt, festzustellen, ob es einer bestimmten Klasse gehört.

Um die IsKindOf-Funktion verwenden

  1. Stellen Sie sicher, dass die Klasse Ablaufklassenunterstützung hat. Das heißt, muss die Klasse direkt oder indirekt von CObject abgeleitet werden und verwendet das DEKLARIEREN_DYNAMISCH und IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE oder die DECLARE_SERIAL und IMPLEMENT_SERIAL, die Makros im Artikel Ableiten einer Klasse von CObject erläutert werden.

  2. Rufen Sie die Memberfunktion IsKindOf für Objekte dieser Klasse, mithilfe des Makros RUNTIME_CLASS auf, um das Argument CRuntimeClass zu generieren, wie hier gezeigt:

    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;
    }
    

    Hinweis

    IsKindOf gibt TRUE zurück, wenn das Objekt ein Member der angegebenen Klasse oder einer Klasse ist, die von der angegebenen Klasse abgeleitet wird.IsKindOf unterstützt Mehrfachvererbung nicht virtuelle oder Basisklassen, obwohl Sie Mehrfachvererbung für die abgeleiteten Foundations-Klassen ggf. Microsoft verwenden können.

Ein Verwendung von Ablaufklasseninformationen ist in der dynamischen Erstellung von Objekten. Dieser Prozess wird im Artikel Dynamisches Erstellen von Objekten erläutert.

Ausführlichere Informationen zur Serialisierung und Laufzeitklasseninformationen finden Sie in Artikel Dateien in MFC und Serialisierung.

Siehe auch

Konzepte

Verwenden von CObject