Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt uitgelegd hoe u tijdens runtime toegang krijgt tot informatie over de klasse van een object.
Opmerking
MFC maakt geen gebruik van de ondersteuning voorRun-Time Type Information (RTTI) die is geïntroduceerd in Visual C++ 4.0.
Als u uw klasse hebt afgeleid van CObject en de DECLARE_DYNAMIC en IMPLEMENT_DYNAMIC, de DECLARE_DYNCREATE en IMPLEMENT_DYNCREATE, of de DECLARE_SERIAL macro's IMPLEMENT_SERIAL die worden uitgelegd in het artikel Een klasse afleiden van CObject, heeft de CObject klasse de mogelijkheid om de exacte klasse van een object tijdens runtime te bepalen.
Deze mogelijkheid is het handigst wanneer extra type controle van functieargumenten nodig is en wanneer u speciale code moet schrijven op basis van de klasse van een object. Deze procedure wordt echter meestal niet aanbevolen omdat deze de functionaliteit van virtuele functies dupliceren.
De CObject lidfunctie IsKindOf kan worden gebruikt om te bepalen of een bepaald object deel uitmaakt van een opgegeven klasse of als het is afgeleid van een specifieke klasse. U kunt het argument voor IsKindOf, een CRuntimeClass-object, verkrijgen met de RUNTIME_CLASS macro door de naam van de klasse te gebruiken.
Om de macro RUNTIME_CLASS te gebruiken
Gebruik
RUNTIME_CLASSdeze met de naam van de klasse, zoals hier wordt weergegeven voor de klasseCObject:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
U hebt zelden rechtstreeks toegang nodig tot het runtimeklasseobject. Een veelvoorkomender gebruik is het doorgeven van het runtime-klasseobject aan de IsKindOf functie, zoals wordt weergegeven in de volgende procedure. De IsKindOf functie test een object om te zien of het deel uitmaakt van een bepaalde klasse.
De functie IsKindOf gebruiken
Zorg ervoor dat de klasse ondersteuning biedt voor runtimeklassen. Dat wil zeggen dat de klasse rechtstreeks of indirect moet zijn afgeleid van
CObjecten de macro's DECLARE_DYNAMIC enIMPLEMENT_DYNAMIC, deDECLARE_DYNCREATEenIMPLEMENT_DYNCREATE, of deDECLARE_SERIALenIMPLEMENT_SERIALzijn gebruikt, zoals uitgelegd in het artikel Een klasse afleiden van CObject.Roep de
IsKindOflidfunctie aan voor objecten van die klasse, met behulp van deRUNTIME_CLASSmacro om hetCRuntimeClassargument te genereren, zoals hier wordt weergegeven: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; }Opmerking
IsKindOf retourneert TRUE als het object lid is van de opgegeven klasse of van een klasse die is afgeleid van de opgegeven klasse.
IsKindOfbiedt geen ondersteuning voor meerdere overname- of virtuele basisklassen, hoewel u indien nodig meerdere overnames kunt gebruiken voor uw afgeleide Microsoft Foundation-klassen.
Eén gebruik van runtimeklassegegevens is het dynamisch maken van objecten. Dit proces wordt besproken in het artikel Dynamisch object maken.
Zie de artikelen Bestanden in MFC en Serialisatie voor meer gedetailleerde informatie over serialisatie en runtimeklassegegevens.