Welcome to graduate2professional.blogspot.com

Sunday, April 1, 2012

What is RTTI in C++ ?

Runtime Type Information (RTTI) is the concept of determining the type of any variable during execution (runtime.) The RTTI mechanism contains:
  • The operator dynamic_cast
  • The operator typeid
  • The struct type_info
RTTI can only be used with polymorphic types. This means that with each class you make, you must have at least one virtual function
The dynamic_cast can only be used with pointers and references to objects. It makes sure that the result of the type conversion is valid and complete object of the requested class.
// dynamic_cast
#include 
#include 
using namespace std;
class Base_Class { virtual void dummy() {} };

class Derived_Class: public Base_Class { int a; };

int main () {
 try {
 Base_Class * ptr_a = new Derived_Class;
 Base_Class * ptr_b = new Base_Class;
 Derived_Class * ptr_c;
    ptr_c = dynamic_cast< Derived_Class* >(ptr_a);
    if (ptr_c ==0) cout << "Null pointer on first type-cast" << endl;

    ptr_c = dynamic_cast< Derived_Class* >(ptr_b);
    if (ptr_c ==0) cout << "Null pointer on second type-cast" << endl;

  } 
 catch (exception& my_ex) {cout << "Exception: " << my_ex.what();
}
 return 0;
}
There are two dynamic_casts from pointer objects of type Base_Class* (namely ptr_a and ptr_b) to a pointer object of type Derived_Class*.
If everything goes well then the first one should be successful and the second one will fail. The pointers ptr_a and ptr_b are both of the type Base_Class. The pointer ptr_a points to an object of the type Derived_Class. The pointer ptr_b points to an object of the type Base_Class. So when the dynamic type cast is performed then ptr_a is pointing to a full object of class Derived_Class, but the pointer ptr_b points to an object of class Base_Class. This object is an incomplete object of class Derived_Class; thus this cast will fail!
bad_cast exception is being thrown in case of conversion fail.
Typeid return an structure of type_info . You can get the detail and type of the object at run time.
int * a;
int b;
a=0; b=0;
if (typeid(a) != typeid(b))
  {
 cout << "a and b are of different types:\n";
 cout << "a is: " << typeid(a).name() << '\n';
 cout << "b is: " << typeid(b).name() << '\n';
  }

No comments:

Post a Comment