Unterschiedliches Verhalten bei der Verwendung von dynamic_cast mit Verweisen und Zeigern

Ich habe das Verhalten von dynamic_cast überprüft und festgestellt, dass bei einem Fehler die Ausnahme std :: bad_cast nur ausgelöst wird, wenn das Ziel ein Referenztyp ist. Wenn das Ziel ein Zeigertyp ist, wird keine Ausnahme von der Umwandlung geworfen. Dies ist mein Beispielcode:

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

Die Ausgabe lautet "Schlechte Besetzung abgefangen" und "Nullzeiger". Code wird mit VS2008 kompiliert. Ist das das richtige Verhalten? Wenn ja, warum gibt es dann einen Unterschied?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage