Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 unterstützung fürRun-Time Type Information (RTTI).
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 für IsKindOf ist ein CRuntimeClass-Objekt, das Sie mit der RUNTIME_CLASS-Makro und dem Namen der Klasse erhalten können.
So verwenden Sie das RUNTIME_CLASS-Makro
Wird
RUNTIME_CLASSmit dem Namen der Klasse verwendet, wie hier für die KlasseCObjectgezeigt: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
Vergewissern Sie sich, dass die Klasse den Support für Laufzeitklassen hat. Das heißt, die Klasse muss direkt oder indirekt von
CObjectabgeleitet worden sein und die DECLARE_DYNAMIC undIMPLEMENT_DYNAMIC, dieDECLARE_DYNCREATEundIMPLEMENT_DYNCREATEoder dieDECLARE_SERIALundIMPLEMENT_SERIALMakros verwendet haben, die im Artikel Ableiten einer Klasse von CObject erklärt werden.Rufen Sie die
IsKindOfMemberfunktion für Objekte dieser Klasse mithilfeRUNTIME_CLASSdes Makros auf, um dasCRuntimeClassArgument 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.
IsKindOfunterstü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".