Partilhar via


Acessando informações da classe runtime

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

Dica

MFC O não usa o suporte de Informações de tipo de tempo de execução () RTTI introduzido no Visual C++ 4.0.

Se você derivadas a sua classe de CObject e usou o _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEde DECLARE, ou macros de DECLARE_SERIAL e de IMPLEMENT_SERIAL explicados no artigo Com uma classe de CObject, a classe de CObject tem a capacidade de determinar em tempo de execução a classe precisa de um objeto.

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

A função de membro IsKindOf de CObject 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 objeto de CRuntimeClass , que você pode obter com a macro de RUNTIME_CLASS com o nome da classe.

Para usar a macro de RUNTIME_CLASS

  • Use RUNTIME_CLASS com o nome da classe, conforme mostrado aqui para a classe CObject:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject ); 
    

Você precisará raramente de acessar diretamente o objeto da classe de tempo de execução. Uso mais comum é passe o objeto da classe de tempo de execução à função de IsKindOf , conforme mostrado no procedimento a seguir. Testes de função de IsKindOf um objeto para verificar se pertence a uma classe específica.

Para usar a função de IsKindOf

  1. Verifique a classe que tem o suporte da classe de tempo de execução. Isto é, a classe deve ter sido derivada direta ou indiretamente de CObject e usou o _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEde DECLARE, ou macros de DECLARE_SERIAL e de IMPLEMENT_SERIAL explicados no artigo Com uma classe de CObject.

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

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

    Dica

    IsKindOf retorna Verdadeiro se o objeto for um membro da classe especificada ou de uma classe derivada da classe especificada.IsKindOf não da suporte a herança múltipla ou classes base virtuais, embora você possa usar a herança múltipla para suas classes derivadas do Microsoft se necessário.

Um uso de informações da classe de tempo de execução estiver em criação dinâmico de objetos. Esse processo é discutido no artigo Criação do objeto dinâmico.

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

Consulte também

Conceitos

Usando CObject