Zugreifen auf Laufzeit-Klasseninformationen
In diesem Artikel wird erläutert, wie Sie zur Laufzeit auf Informationen zur Klasse eines Objekts zugreifen.
Hinweis
MFC verwendet nicht die in Visual C++ 4.0 eingeführte RTTI-Unterstützung (Run-Time Type Information ).
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
Wird
RUNTIME_CLASS
mit dem Namen der Klasse verwendet, wie hier für die KlasseCObject
gezeigt: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
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, dieIMPLEMENT_DYNAMIC
und , dieDECLARE_DYNCREATE
undIMPLEMENT_DYNCREATE
und die MakrosIMPLEMENT_SERIAL
, dieDECLARE_SERIAL
im Artikel "Ableiten einer Klasse von CObject" erläutert werden.Rufen Sie die
IsKindOf
Memberfunktion für Objekte dieser Klasse mithilfeRUNTIME_CLASS
des Makros auf, um dasCRuntimeClass
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".