Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver hur du kommer åt information om klassen för ett objekt under körtid.
Anmärkning
MFC använder inte rtti-stödet ( Run-Time Type Information ) som introducerades i Visual C++ 4.0.
Om du har härlett din klass från CObject och använt makrona DECLARE_DYNAMIC och IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE och IMPLEMENT_DYNCREATE, eller DECLARE_SERIAL och IMPLEMENT_SERIAL som förklaras i artikeln Deriving a Class from CObject, så har klassen möjlighet att fastställa den exakta klassen för ett objekt vid körtid.
Den här möjligheten är mest användbar när extra typkontroll av funktionsargument behövs och när du måste skriva specialkod baserat på klassen för ett objekt. Den här metoden rekommenderas dock vanligtvis inte eftersom den duplicerar funktionerna i virtuella funktioner.
Medlemsfunktionen CObjectIsKindOf kan användas för att avgöra om ett visst objekt tillhör en angiven klass eller om det härleds från en specifik klass. Argumentet till IsKindOf är ett CRuntimeClass objekt som du kan hämta med hjälp RUNTIME_CLASS av makrot med namnet på klassen.
Så här använder du makrot RUNTIME_CLASS
Använd
RUNTIME_CLASSmed namnet på klassen, som du ser här för klassenCObject:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
Du behöver sällan komma åt körningsklassobjektet direkt. En vanligare användning är att skicka körningsklassobjektet till IsKindOf funktionen, som du ser i nästa procedur. Funktionen IsKindOf testar ett objekt för att se om det tillhör en viss klass.
Så här använder du funktionen IsKindOf
Kontrollera att klassen har stöd för körtidsklassstöd. Det vill säga klassen måste ha härletts direkt eller indirekt från
CObjectoch använt DECLARE_DYNAMIC ochIMPLEMENT_DYNAMIC,DECLARE_DYNCREATEochIMPLEMENT_DYNCREATE, eller makronDECLARE_SERIALIMPLEMENT_SERIALsom förklaras i artikeln Deriving a Class from CObject.IsKindOfAnropa medlemsfunktionen för objekt i den klassen med hjälp av makrotRUNTIME_CLASSför att genereraCRuntimeClassargumentet, som du ser här: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; }Anmärkning
IsKindOf returnerar TRUE om objektet är medlem i den angivna klassen eller en klass som härleds från den angivna klassen.
IsKindOfstöder inte flera arvsklasser eller virtuella basklasser, men du kan använda flera arv för dina härledda Microsoft Foundation-klasser om det behövs.
En användning av körtidsklassinformation är i den dynamiska skapelsen av objekt. Den här processen beskrivs i artikeln Dynamiskt objektskapande.
Mer detaljerad information om serialisering och körningsklassinformation finns i artiklarna Filer i MFC och Serialisering.