In C++ primer(5th) 19.2.1 about dynamic_cast. It says, for dynamic_cast
to be successful,
the type of e must be either a cla
The type of pb
is indeed a public base class of D
, but the object that pb
points to is not the base subobject of any object of type D
. The dynamic cast detects this and returns null.
If indeed you did attempt to cast the pointer to a base subobject of a D
object, you would get the (non-null) pointer to the D
object:
D obj;
B *pb = &obj; // points at subobject
assert(&obj == dynamic_cast<D*>(pb));
The requirement that you've cited is merely a static requirement that allows you to use the dynamic cast at all -- but it does not describe the result of using the cast. That's described later on.
dynamic_cast
can be used as a tool to detect if an object is derived from another one or not, in the code you've written, the answer is NO, so you got a null. By
B *pb = new B;
D *pd = dynamic_cast<D*>(pb);
You're down-casting a base to a derived, and it is reverse of what the documet is saying. Of course you can have below if pb
points to an extact D*
:
B *pb = new D; // <--- It is a `D`
D *pd = dynamic_cast<D*>(pb);