•
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 )
|