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ří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_DYNCREATEa 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

  1. Použijte RUNTIME_CLASS s názvem třídy, jak je znázorněno zde pro třídu CObject:

    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

  1. 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 a IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE a , a IMPLEMENT_DYNCREATE, nebo DECLARE_SERIAL a makra IMPLEMENT_SERIAL vysvětlena v článku Odvození třídy z objektu CObject.

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

Viz také

Použití objektů CObject