RAD Studio |  |

__rtti, -RT Option
See Also
Collapse All

Category (__rtti keyword)

Modifiers, C++ Keyword Extensions, C++-Specific Keywords

Description

Runtime type identification is enabled by default. You can disable RTTI on the C++ page of the Project Options dialog box. From the command-line, you can use the -RT- option to disable it or -RT to enable it.

If RTTI is disabled, or if the argument to typeid is a pointer or a reference to a non-polymorphic class, typeid returns a reference to a const type_info object that describes the declared type of the pointer or reference, and not the actual object that the pointer or reference is bound to.

In addition, even when RTTI is disabled, you can force all instances of a particular class and all classes derived from that class to provide polymorphic runtime type identification (where appropriate) by using the __rtti keyword in the class definition.

When runtime type identification is disabled, if any base class is declared __rtti, then all polymorphic base classes must also be declared __rtti.

Copy Code

    struct __rtti S1 { virtual s1func(); };  /* Polymorphic */
    struct __rtti S2 { virtual s2func(); };  /* Polymorphic */
    struct X : S1, S2 { };

If you turn off the RTTI mechanism, type information might not be available for derived classes. When a class is derived from multiple classes, the order and type of base classes determines whether or not the class inherits the RTTI capability.

When you have polymorphic and non-polymorphic classes, the order of inheritance is important. If you compile the following declarations without RTTI, you should declare X with the __rtti modifier. Otherwise, switching the order of the base classes for the class X results in the compile-time error "Can't inherit non-RTTI class from RTTI base 'S1'."

Copy Code

    struct __rtti S1 { virtual func(); };   /* Polymorphic class */
    struct S2 { };                           /*  Non-polymorphic class */
    struct __rtti X : S1, S2 { };

Note: The class X is explicitly declared with __rtti
. This makes it safe to mix the order and type of classes. In the following example, class X inherits only non-polymorphic classes. Class X does not need to be declared __rtti.
Copy Code

    struct __rtti S1 {  };   // Non-polymorphic class
    struct S2 { };
    struct X : S2, S1 { };   // The order is not essential

Neither the __rtti keyword, nor enabling RTTI will make a static class into a polymorphic class.

See Also

Runtime Type Identification (RTTI) Overview

Runtime Type Identification And Destructors

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!