Lets say we have a class hierarchy. At the bottom we have Base and at the top Derived. How to determine object class even if it is converted to base class pointer.
Base* b = new Derived():
typeid(b).name(); // i want this to tell me that this is actually derived not base object
is there any way other than manual implementation of string field or such and virtual get function?
PS: I talking about compiler-independent solution
If all you want to do is find if
b
actually points toDerived
, just usedynamic_cast()
:dynamic_cast
returns a null pointer if the actual runtime type of the object pointed to byb
is notDerived
(or a class derived fromDerived
). Unlike thename()
member ofstd::type_info
, this is compiler-invariant.Note that this only works if
Base
has at least one virtual member functions. Which it should anyway, since you're manipulating types derived from it through a base pointer, so it should have a virtual destructor.make sure the base class has at least one virtual method, include
<typeinfo>
and use your current code just with an additional dereferencing,typeid(*b).name()
.in passing, note that a
typeid
call is the one place in C++ where you can dereference a nullpointer with well-defined behavior, which implies that it can throw an exception: