Estaba comprobando el comportamiento de dynamic_cast y descubrí que cuando falla, la excepción std :: bad_cast se produce solo si el destino es un tipo de referencia. Si el destino es un tipo de puntero, entonces no se lanza ninguna excepción del elenco. Este es mi código de muestra:Diferencia de comportamiento al usar dynamic_cast con referencia y punteros
class A
{
public:
virtual ~A()
{
}
};
class B : public A
{
};
int main()
{
A* p = new A;
//Using reference
try
{
B& b = dynamic_cast<B&>(*p);
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
//Using pointer
try
{
B* pB = dynamic_cast<B*>(p);
if(pB == NULL)
{
std::cout<<"NULL Pointer\n";
}
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
return 0;
}
La salida es "Caught bad cast" y "NULL puntero". El código se compila utilizando VS2008. ¿Es este el comportamiento correcto? Si es así, ¿por qué hay una diferencia?
Pero, ¿por qué no se puede lanzar la excepción en el caso de los punteros también? – Naveen
Tendría que intentar capturar cada dynamic_cast que es código sucio. En su lugar, puede tomar la dirección, dynamic_cast y comprobar null. – sharptooth
Además, arrojar y atrapar excepciones es relativamente costoso, y sospecho que los diseñadores querían encontrar una manera de minimizar ese costo. –