Sdílet prostřednictvím


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

  1. 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.

  2. 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.

Viz také

Koncepty

Použití objektů CObject