The typeid Operator

C++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 run-time type identification (RTTI) support in C++. The operator has the following form:

>>-typeid--(--+-expr------+--)---------------------------------><
              '-type-name-'
 
 

The typeid operator requires run-time type information (RTTI) to be generated, which must be explicitly specified at compile time through a compiler option.

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.

Related References

IBM Copyright 2003