I always think of having to use pointers for polymorphism. Using the canonical example:
DrawEngine::render(Shape *shape)
{
shape->draw();
shape-&g
Regarding dynamic_cast, a failed cast produces a nullpointer with pointers, and results in a throw of a bad_cast (IIRC) exception with references.
One reason is that there's no such thing as a valid null-reference.
And possibly another reason (but it could just be an unintentionally useful emergent feature) is that sometimes one needs the exception and sometimes one needs the easy-to-check nullpointer, and no matter whether you have a reference or pointer at hand it takes at most a dereferencing or address operator to obtain the behavior you want.
Cheers & hth.,