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řídě objektu za běhu.
Poznámka
MFC nepoužívá podporu informací o typu za běhu (RTTI) zavedenou v jazyce Visual C++ 4.0.
Pokud jste odvozovali třídu z objektu CObject a použili declare_DYNAMIC a IMPLEMENT_DYNAMIC
, DECLARE_DYNCREATE
a , a IMPLEMENT_DYNCREATE
a nebo DECLARE_SERIAL
a makra IMPLEMENT_SERIAL
vysvětlená v článku Odvození třídy z objektu CObject, CObject
třída má schopnost určit přesnou třídu objektu za běhu.
Tato schopnost je nejužitečnější v případě, že je nutná další kontrola typů argumentů funkce a kdy je nutné napsat speciální účelový kód založený na třídě objektu. Tento postup se ale obvykle nedoporučuje, protože duplikuje funkce virtuálních funkcí.
Členová CObject
funkce IsKindOf
lze použít k určení, zda konkrétní objekt patří do zadané třídy nebo je odvozen z konkrétní třídy. Argumentem IsKindOf
CRuntimeClass
je objekt, který můžete získat pomocí RUNTIME_CLASS
makra s názvem třídy.
Použití makra RUNTIME_CLASS
Použijte
RUNTIME_CLASS
s názvem třídy, jak je znázorněno zde pro tříduCObject
:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
K objektu třídy runtime budete potřebovat přístup jen zřídka. Častějším způsobem je předání objektu třídy runtime do IsKindOf
funkce, jak je znázorněno v dalším postupu. Funkce IsKindOf
testuje objekt, aby zjistil, jestli patří do určité třídy.
Použití funkce IsKindOf
Ujistěte se, že třída podporuje třídu za běhu. To znamená, že třída musí být odvozena přímo nebo nepřímo z
CObject
dEKLAR_DYNAMIC aIMPLEMENT_DYNAMIC
,DECLARE_DYNCREATE
a , aIMPLEMENT_DYNCREATE
, neboDECLARE_SERIAL
a makraIMPLEMENT_SERIAL
vysvětlena v článku Odvození třídy z objektu CObject.IsKindOf
Volání členské funkce pro objekty této třídy pomocíRUNTIME_CLASS
makra k vygenerování argumentuCRuntimeClass
, 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
IsKindOf vrátí hodnotu TRUE , pokud je objekt členem zadané třídy nebo třídy odvozené ze zadané třídy.
IsKindOf
nepodporuje více dědičnosti nebo virtuálních základních tříd, ačkoli v případě potřeby můžete pro odvozené třídy Služby Microsoft Foundation použít více dědičnosti.
Jedním z použití informací o třídě za běhu je dynamické vytváření objektů. Tento proces je popsán v článku Dynamické vytváření objektů.
Podrobnější informace o serializaci a běhových třídách naleznete v článcích Soubory v MFC a Serializace.