Thinking in C++ Vol 2 - Practical Programming |
Prev |
Home |
Next |
Typically, RTTI is implemented by placing an additional pointer in a class s virtual function table. This pointer points to the type_info structure for that particular type. The effect of a typeid( )
expression is quite simple: the virtual function table pointer fetches the type_info
pointer, and a reference to the resulting type_info structure is
produced. Since this is just a two-pointer dereference operation, it is a
constant time operation.
For a dynamic_cast<destination*>(source_pointer),
most cases are quite straightforward: source_pointer s RTTI information
is retrieved, and RTTI information for the type destination* is fetched.
A library routine then determines whether source_pointer s type is of
type destination* or a base class of destination*. The pointer it
returns may be adjusted because of multiple inheritance if the base type isn t the first base of the derived class. The situation is more complicated with
multiple inheritance because a base type may appear more than once in an
inheritance hierarchy and virtual base classes are used.
Because the library routine used for dynamic_cast
must check through a list of base classes, the overhead for dynamic_cast
may be higher than typeid( ) (but you get different information,
which may be essential to your solution), and it may take more time to discover
a base class than a derived class. In addition, dynamic_cast compares
any type to any other type; you aren t restricted to comparing types within the
same hierarchy. This adds extra overhead to the library routine used by dynamic_cast.
Thinking in C++ Vol 2 - Practical Programming |
Prev |
Home |
Next |