Přístup k běhovým informacím o třídě
Tento článek vysvětluje, jak získat přístup k informacím o třídu objektu za běhu.
[!POZNÁMKA]
MFC nepoužívá Informace o typu Run-Time (RTTI) podpory zavedené v aplikaci Visual C++ 4.0.
Pokud mají odvozené třídě z třídy CObject a DECLARE_DYNAMICKÝ a IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE a IMPLEMENT_DYNCREATE, nebo DECLARE_SERIAL a IMPLEMENT_SERIAL makra jsou vysvětleny v článku odvození třídy od třídy CObject, CObject třída má schopnost určit přesné třídy objektu za běhu.
Tato možnost je nejužitečnější, když je zapotřebí zvláštní typ kontroly argumentů funkce a musíte napsat speciální kód na základě třídy objektu.Tento postup však není obvykle doporučeno, protože duplikuje funkci virtuální funkce.
CObject Členské funkce IsKindOf lze použít k určení, pokud daný objekt patří do dané třídy, nebo pokud je odvozen od specifické třídy.Argument IsKindOf je CRuntimeClass objekt, který lze získat při použití RUNTIME_CLASS makro s názvem třídy.
Chcete-li použít makro RUNTIME_CLASS, která
Použití RUNTIME_CLASS s názvem třídy, jak je znázorněno zde pro třídu CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Jen zřídka budete potřebovat přístup k objektu běhové třídy přímo.Běžnější použití je předat objekt třídy běhu IsKindOf fungovat, jak je znázorněno v následujícím postupu.IsKindOf Funkce testuje zobrazíte, pokud patří do konkrétní třídy.
Chcete-li použít funkci IsKindOf
Zkontrolujte, zda že má podpora běhové třídy třída.To znamená, že třída musí pocházet přímo nebo nepřímo z CObject a DECLARE_dynamické a IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE a IMPLEMENT_DYNCREATE, nebo DECLARE_SERIAL a IMPLEMENT_SERIAL makra jsou vysvětleny v článku odvození třídy od třídy CObject.
Volat IsKindOf členské funkce pro objekty této třídy, použití RUNTIME_CLASS makro pro vytvoření CRuntimeClass argument, jak je znázorněno zde:
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; }
[!POZNÁMKA]
Vrátí IsKindOf TRUE Pokud je členem určené třídy nebo třídy odvozené od třídy zadaný objekt.IsKindOfnepodporuje více dědičnost nebo virtuální základní třídy, ale v případě potřeby můžete použít vícenásobnou dědičnost pro vaše odvozené třídy Microsoft Foundation.
Jeden informace běhové třídy slouží k vytvoření dynamických objektů.Tento proces je popsán v článku Dynamické vytvoření objektu.
Další informace o serializace a běhovou třídou informace naleznete v článcích soubory v knihovně MFC a serializace.