Różnica w zachowaniu podczas używania dynamic_cast z odniesieniem i wskaźnikami

Sprawdzałem zachowanie dynamic_cast i stwierdziłem, że gdy się nie powiedzie, wyjątek std :: bad_cast jest generowany tylko wtedy, gdy celem jest typ odniesienia. Jeśli celem jest typ wskaźnika, nie ma wyjątku od rzutu. To jest mój przykładowy kod:

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

Wyjście to „Caught bad cast” i „NULL pointer”. Kod jest kompilowany przy użyciu VS2008. Czy to jest prawidłowe zachowanie? Jeśli tak, to dlaczego jest różnica?

questionAnswers(4)

yourAnswerToTheQuestion