Diferencia de comportamiento al usar dynamic_cast con referencia y punteros
Estaba comprobando el comportamiento de dynamic_cast y descubrí que cuando falla, la excepción std :: bad_cast se lanza solo si el destino es un tipo de referencia. Si el destino es un tipo de puntero, no se lanzará ninguna excepción desde la conversión. Este es mi código de muestra:
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í, entonces ¿por qué hay una diferencia?