The typeid operator (C++ only)
The typeid operator provides a program with the ability to retrieve the actual derived type of the object referred to by a pointer or a reference. This operator, along with the dynamic_cast operator, are provided for runtime type identification (RTTI) support in C++.
The typeid operator returns an lvalue of type const std::type_info that represents the type of expression expr. You must include the standard template library header <typeinfo> to use the typeid operator.
If expr is a reference or a dereferenced pointer to a polymorphic
class, typeid will return a type_info object
that represents the object that the reference or pointer denotes at run time.
If it is not a polymorphic class, typeid will return a type_info object
that represents the type of the reference or dereferenced pointer. The following
example demonstrates this:
#include <iostream>
#include <typeinfo>
using namespace std;
struct A { virtual ~A() { } };
struct B : A { };
struct C { };
struct D : C { };
int main() {
B bobj;
A* ap = &bobj;
A& ar = bobj;
cout << "ap: " << typeid(*ap).name() << endl;
cout << "ar: " << typeid(ar).name() << endl;
D dobj;
C* cp = &dobj;
C& cr = dobj;
cout << "cp: " << typeid(*cp).name() << endl;
cout << "cr: " << typeid(cr).name() << endl;
}
The following is the output of the above example: ap: B
ar: B
cp: C
cr: C
Classes A and B are polymorphic;
classes C and D are not. Although cp and cr refer
to an object of type D, typeid(*cp) and typeid(cr) return
objects that represent class C.Lvalue-to-rvalue, array-to-pointer, and function-to-pointer conversions
will not be applied to expr. For example, the output of the following
example will be int [10], not int *:
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
int myArray[10];
cout << typeid(myArray).name() << endl;
}
If expr is a class type, that class must be completely
defined.The typeid operator ignores top-level const or volatile qualifiers.