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

Veja também

static_cast
reinterpret_cast
const_cast
typeid
RTTI

Ferramentas pessoais