Dynamic cast
De ccppbrasil.org
Cast (conversão) utilizado para obter um ponteiro ou referência para um objeto do tipo especificado.
O dynamic_cast pode ser utilizado sobre ponteiros ou referências. Quando utilizado sobre ponteiros ele retornará um ponteiro nulo caso o cast não possa ser feito, quando utilizado sobre referências, uma exceção do tipo std::bad_cast será liberada em caso de falha.
O dynamic_cast é geralmente usado para fazer cast de uma classe mais alta na hierarquia para uma classe mais baixa (downcasting). Esse tipo de cast não pode ser feito usando o static_cast porque, em tempo de compilação, o compilador não consegue deduzir se a conversão é possível ou não. A validade dessa conversão é verificada em tempo de execução. O dynamic_cast deve ser usado em objetos polimórficos.
Exemplo
#include <iostream>
class Base
{
public:
virtual ~Base() { }
};
class Derivada : public Base
{
public:
virtual ~Derivada() { }
};
int main()
{
Base* base = new Base;
Base* derivada = new Derivada;
Base& base_ref = *derivada;
// verdade: derivada é do tipo Derivada, apesar de ser um ponteiro para Base
if( dynamic_cast<Derivada*>(derivada) )
std::cout << "Classe derivada!\n";
// mentira: base é apenas do tipo Base
if( dynamic_cast<Derivada*>( base ) )
std::cout << "Classe derivada!\n";
try {
Derivada& derivada_ref = dynamic_cast<Derivada&>(base_ref);
} catch (std::bad_cast& e) {
std::cout << "Cast falhou!\n";
}
delete base;
delete derivada;
}
