Acessando informações da classe runtime

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

Observação

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

Se você tiver derivado sua classe do CObject e usado as macros DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE ou DECLARE_SERIALe IMPLEMENT_SERIAL explicadas no artigo Derivar uma classe a partir do CObject, a classe CObject terá 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ê precisa escrever um 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 função membro CObjectIsKindOf pode ser usada para determinar se um objeto em particular pertence a uma classe especificada ou se é derivado de uma classe específica. O argumento a ser IsKindOf é um objeto CRuntimeClass, que você pode obter usando a macro RUNTIME_CLASS com o nome da classe.

Para usar a macro RUNTIME_CLASS

  1. Use RUNTIME_CLASS com o nome da classe, conforme 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 de classe em tempo de execução para a função IsKindOf, conforme mostrado no próximo procedimento. A função IsKindOf testa um objeto para ver se ele pertence a uma classe específica.

Para usar a função IsKindOf

  1. Verifique se a classe tem suporte de classe em tempo de execução. Ou seja, a classe deve ter sido derivada direta ou indiretamente de CObject e ter usado as macros DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEou DECLARE_SERIAL e IMPLEMENT_SERIAL explicadas no artigo Derivar uma classe a partir do CObject.

  2. Chame a função membro IsKindOf para objetos dessa classe usando a macro RUNTIME_CLASS para gerar o argumento CRuntimeClass, 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 dá suporte a várias classes de herança ou base virtual, embora você possa usar várias heranças para suas classes derivadas do Microsoft Foundation, se necessário.

Um uso de informações de classe em tempo de execução está na criação dinâmica de objetos. Esse processo é discutido no artigo Criação dinâmica de objetos.

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

Confira também

Usando CObject