C++
Home

RTTI - Tipos durante Execução

( RTTI - Run-time type information )

Usamos o objeto typeid para conhecer qual o tipo do objeto durante a execução.
Exemplo:

#include <iostream>

#include <typeinfo>

class Teste {
  int t;
};

int main()
{
  Teste a;

  std::cout << typeid( a ).name();

  system("pause");

  return 0;
}

 

A função name() retorna um string ao estilo C, representando o tipo de a.

O objeto typeid retorna uma referencia para o objeto type_info. Um objeto type_info é um objeto mantido pelo sistema que representa um tipo.

- O string retornado por name é mantido pelo sistema e não deve ser modificado.

 

O operador dynamic_cast assegura que uma conversão é segura e pode ser feita adequadamente durante a execução, já que o compilador não consegue verificar se é ou não uma conversão adequada.

dynamic_cast é usado para fazer downcast ( converter um ponteiro de uma classe base para uma classe derivada ).

Exemplo:

#include <iostream>

#include <typeinfo>

class Teste {
public :
   virtual void print() const { std::cout << "Teste"<< std::endl; }
};

class Derivada : public Teste {
public:
   virtual void print() const { std::cout << "Derivada"<< std::endl; }
};

void polimorfica( const Teste * );

int main()
{

   Derivada derivada;
   Teste *ptr = 0;

   polimorfica( &derivada ); // essa chamada causa erro no meu compilador
   polimorfica( ptr );

   system("pause");

   return 0;
}

void polimorfica( const Teste *testePtr )
{
   const Derivada * derivadaPtr;

   derivadaPtr = dynamic_cast< const Derivada * >( testePtr );

   if ( derivadaPtr != 0 )
   {
      derivadaPtr->print();
   }   
   else
   {   
      std::cout << "Erro" << std::endl;
   }   
}

- Tentar usar dynamic_cast sobre um ponteiro do tipo void * é um erro de sintaxe.

- RTTI foi concebido para ser usado com hierarquivos polimorficas ( com função virtual )