Zugreifen auf Laufzeit-Klasseninformationen

In diesem Artikel wird erläutert, wie Sie zur Laufzeit auf Informationen zur Klasse eines Objekts zugreifen.

Wenn Sie Die Klasse von CObject abgeleitet und die DECLARE_DYNAMIC und IMPLEMENT_DYNAMIC, die DECLARE_DYNCREATE und IMPLEMENT_DYNCREATE, oder die DECLARE_SERIAL im IMPLEMENT_SERIAL Artikel "Ableiten einer Klasse von CObject" erläuterten Makros verwendet haben, hat die CObject Klasse die Möglichkeit, die genaue Klasse eines Objekts zur Laufzeit zu bestimmen.

Diese Fähigkeit ist besonders nützlich, wenn eine zusätzliche Typüberprüfung von Funktionsargumenten erforderlich ist und wenn Sie speziellen Code basierend auf der Klasse eines Objekts schreiben müssen. Diese Vorgehensweise wird jedoch in der Regel nicht empfohlen, da sie die Funktionalität virtueller Funktionen dupliziert.

Die CObject Memberfunktion IsKindOf kann verwendet werden, um zu bestimmen, ob ein bestimmtes Objekt zu einer angegebenen Klasse gehört oder ob es von einer bestimmten Klasse abgeleitet wird. Das argument to IsKindOf is a CRuntimeClass object, which you can get using the RUNTIME_CLASS macro with the name of the class.

So verwenden Sie das RUNTIME_CLASS-Makro

  1. Wird RUNTIME_CLASS mit dem Namen der Klasse verwendet, wie hier für die Klasse CObjectgezeigt:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Sie müssen nur selten direkt auf das Laufzeitklassenobjekt zugreifen. Eine häufigere Verwendung besteht darin, das Laufzeitklassenobjekt an die IsKindOf Funktion zu übergeben, wie in der nächsten Prozedur dargestellt. Die IsKindOf Funktion testet ein Objekt, um festzustellen, ob es zu einer bestimmten Klasse gehört.

So verwenden Sie die IsKindOf-Funktion

  1. Stellen Sie sicher, dass der Kurs Laufzeitklassen unterstützt. Das heißt, die Klasse muss direkt oder indirekt von CObject der DECLARE_DYNAMIC abgeleitet und verwendet worden sein, die IMPLEMENT_DYNAMICund , die DECLARE_DYNCREATE und IMPLEMENT_DYNCREATEund die MakrosIMPLEMENT_SERIAL, die DECLARE_SERIAL im Artikel "Ableiten einer Klasse von CObject" erläutert werden.

  2. Rufen Sie die IsKindOf Memberfunktion für Objekte dieser Klasse mithilfe RUNTIME_CLASS des 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;
    }
    

    Hinweis

    IsKindOf gibt TRUE zurück, wenn das Objekt ein Element der angegebenen Klasse oder einer von der angegebenen Klasse abgeleiteten Klasse ist. IsKindOf unterstützt nicht mehrere Vererbungs- oder virtuelle Basisklassen, obwohl Sie bei Bedarf mehrere Vererbungen für Ihre abgeleiteten Microsoft Foundation-Klassen verwenden können.

Eine Verwendung von Laufzeitklasseninformationen ist die dynamische Erstellung von Objekten. Dieser Prozess wird im Artikel Dynamische Objekterstellung erläutert.

Ausführlichere Informationen zur Serialisierung und Laufzeitklasseninformationen finden Sie in den Artikeln "Dateien in MFC " und "Serialisierung".

Siehe auch

Verwenden von CObject