Partilhar via


Aceder a informações de classe Run-Time

Este artigo explica como acessar informações sobre a classe de um objeto em tempo de execução.

Observação

MFC não usa o suporte a informações de tipoRun-Time (RTTI) introduzido no Visual C++ 4.0.

Se você derivou sua classe de CObject e usou o DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou as DECLARE_SERIAL macros e IMPLEMENT_SERIAL explicadas no artigo Derivando uma classe de CObject, a CObject classe tem a capacidade de determinar a classe exata de um objeto em tempo de execução.

Essa capacidade é mais útil quando a verificação de tipo extra de argumentos de função é necessária e quando você deve escrever código de finalidade especial com base na classe de um objeto. No entanto, essa prática geralmente não é recomendada porque duplica a funcionalidade de funções virtuais.

A CObject função IsKindOf de membro pode ser usada para determinar se um determinado objeto pertence a uma classe especificada ou se é derivado de uma classe específica. O argumento para IsKindOf é um CRuntimeClass objeto, que você pode obter usando a RUNTIME_CLASS macro com o nome da classe.

Para usar a macro RUNTIME_CLASS

  1. Use RUNTIME_CLASS com o nome da classe, como mostrado aqui para a classe CObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Você raramente precisará acessar o objeto de classe em tempo de execução diretamente. Um uso mais comum é passar o objeto da classe em tempo de execução para a função IsKindOf, conforme mostrado no próximo procedimento. A IsKindOf função testa um objeto para ver se ele pertence a uma classe específica.

Para usar a função IsKindOf

  1. Certifique-se de que a classe tem suporte em tempo de execução. Ou seja, a classe deve ter sido derivada direta ou indiretamente de CObject e usada a DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, a DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou as DECLARE_SERIAL e IMPLEMENT_SERIAL macros explicadas no artigo Derivando uma classe de CObject.

  2. Chame a IsKindOf função de membro para objetos dessa classe, usando a RUNTIME_CLASS macro para gerar o CRuntimeClass argumento, conforme mostrado aqui:

    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;
    }
    

    Observação

    IsKindOf retornará TRUE se o objeto for um membro da classe especificada ou de uma classe derivada da classe especificada. IsKindOf não oferece suporte a várias heranças ou classes base virtuais, embora você possa usar várias heranças para suas classes derivadas do Microsoft Foundation, se necessário.

Um dos usos das informações de classe em tempo de execução é na criação dinâmica de objetos. Este processo é discutido no artigo Criação dinâmica de objetos.

Para obter informações mais detalhadas sobre serialização e informações de classe de tempo de execução, consulte os artigos Arquivos em MFC e Serialização.

Ver também

Usando CObject