How to determine actual object type at runtime in C++;

user1079475 picture user1079475 · Apr 9, 2013 · Viewed 23.8k times · Source

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

Answer

Cheers and hth. - Alf picture Cheers and hth. - Alf · Apr 9, 2013

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:

C++11 §5.2.8/2:
“If the glvalue expression is obtained by applying the unary * operator to a pointer and the pointer is a null pointer value (4.10), the typeid expression throws the std::bad_typeid exception (18.7.3).”