Diferença no comportamento ao usar dynamic_cast com referência e ponteiros
Eu estava verificando o comportamento do dynamic_cast e descobri que quando ele falha, a exceção std :: bad_cast é lançada somente se o destino for um tipo de referência. Se o destino for um tipo de ponteiro, nenhuma exceção será lançada do lançamento. Este é o meu código de amostra:
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;
}
A saída é "Captura incorreta" e "Ponteiro NULO". Código é compilado usando o VS2008. Esse é o comportamento correto? Se sim, então porque há uma diferença?