Freigeben über


Zugreifen auf Ablaufklasseninformationen

In diesem Artikel wird beschrieben wie Informationen über die Klasse eines Objekts zur Laufzeit.

HinweisHinweis

MFC verwendet nicht die Unterstützung Laufzeit-Typeninformation (RTTI), die in Visual C++ 4.0 eingegeben wird.

Wenn Sie die Klasse von CObject abgeleitet haben und das DECLARE_DYNAMIC und IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE oder die DECLARE_SERIAL und IMPLEMENT_SERIAL Makros, die im Artikel Eine Klasse von CObject abgeleitete erläuterten haben, hat die CObject-Klasse die Möglichkeit, die genaue Klasse eines Objekts zur Laufzeit zu bestimmen.

Diese Fähigkeit ist besonders hilfreich, wenn zusätzliche Typüberprüfung von Funktionsargumenten benötigt wird, und wenn Sie für spezielle Zwecke auf Grundlage der Klasse eines Objekts Code schreiben müssen.Diese Vorgehensweise wird jedoch normalerweise nicht empfohlen, da sie die Funktionen eines virtuellen Funktionen dupliziert.

Die CObject-Memberfunktion IsKindOf kann verwendet werden, um zu bestimmen, ob ein bestimmtes Objekt einer bestimmten Klasse gehört, oder wenn es 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.

So verwenden RUNTIME_CLASS-Makro

  • 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 die Laufzeit klassenobjekt selten direkt zugreifen.Eine mehr allgemeinen Verwendung zur Laufzeit darstellt, das klassenobjekt IsKindOf-Funktion, wie in der folgenden Prozedur gezeigt wird.Die IsKindOf Tests Funktion, ein Objekt zu prüfen, ob es eine bestimmte Klasse angehört.

So verwenden IsKindOf-Funktion

  1. Stellen Sie sicher, dass die Klasse Laufzeitklassen Pfadunterstützung verfügt.Das heißt, muss die Klasse abgeleitet CObject, der direkt oder indirekt worden sein, und das verwendete DECLARE_DYNAMIC und IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE oder die DECLARE_SERIAL und IMPLEMENT_SERIAL Makros, die im Artikel Eine Klasse von CObject abgeleitete erläutert werden.

  2. Rufen Sie die IsKindOf-Memberfunktion für Objekte dieser Klasse unter Verwendung des RUNTIME_CLASS Makros auf, um das CRuntimeClass-Argument 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;
    }
    
    HinweisHinweis

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

Bei Verwendung von klasseninformationen ist in der dynamischen Erstellung von Objekten.Dieser Prozess wird im Artikel Dynamisches Objekt-Erstellung erläutert.

Ausführlichere Informationen über die Serialisierung finden Sie in der klasseninformationen Laufzeit und Dateien in MFC Artikel und Serialisierung.

Siehe auch

Konzepte

Verwenden von CObject