The key difference between pointers and references is that there is no such thing like null reference. A reference is always identifies a valid object in the memory.
Base *bp = ...; // null, if dynamic_cast is invalid if ( Derived *dp = dynamic_cast<Derived*>(bp) ) { // ... } Base &br = ...; // throws exception, if dynamic_cast is invalid try { Derived &dr = dynamic_cast<Derived&>(br); // .... } catch( bad_cast ) { ... }