In programming, RTTI (Run-Time Type Information, or Run-Time Type Identification) refers to a C++ system that makes information about an object's data type available at runtime. Run-time type information can apply to simple data types, such as integers and characters, or to generic objects. This is a C++ implementation of a more generic concept called reflection or, more specifically, type introspection.
In the original C++ design, Bjarne Stroustrup did not include run-time type information, because he thought this mechanism was frequently misused.[1]
Contents |
The dynamic_cast<>
operation and typeid
operator in C++ are part of RTTI.
The C++ run-time type information permits performing safe typecasts and manipulate type information at run time.
RTTI is available only for classes which are polymorphic, which means they have at least one virtual method. In practice, this is not a limitation because base classes must have a virtual destructor to allow objects of derived classes to perform proper cleanup if they are deleted from a base pointer.
RTTI is optional with some compilers; the programmer can choose at compile time whether to include the function. There may be a resource cost to making RTTI available even if the program does not use it.
/* A base class pointer can point to objects of any class which is derived * from it. RTTI is useful to identify which type (derived class) of object is * pointed to by a base class pointer. */ #include <iostream> class abc // base class { public: virtual ~abc() { } virtual void hello() { std::cout << "in abc"; } }; class xyz : public abc { public: void hello() { std::cout << "in xyz"; } }; int main() { abc *abc_pointer = new xyz(); xyz *xyz_pointer; // to find whether abc_pointer is pointing to xyz type of object xyz_pointer = dynamic_cast<xyz*>(abc_pointer); if (xyz_pointer != NULL) { std::cout << "abc_pointer is pointing to a xyz class object"; // identified } else { std::cout << "abc_pointer is NOT pointing to a xyz class object"; } // needs virtual destructor delete abc_pointer; return 0; }
An instance where RTTI is used is illustrated below:
class base { virtual ~base(){} }; class derived : public base { public: virtual ~derived(){} int compare (derived &ref); }; int my_comparison_method_for_generic_sort (base &ref1, base &ref2) { derived & d = dynamic_cast<derived &>(ref1); // RTTI used here // RTTI enables the process to throw a bad_cast exception // if the cast is not successful return d.compare (dynamic_cast<derived &>(ref2)); }