__rtti、-RT オプション
__rtti キーワードのカテゴリ
説明
実行時型情報は、デフォルトでは有効になっています。 [<プロジェクト名> のプロジェクト オプション]ダイアログ ボックスの[C++ コンパイラ]ページで、RTTI を無効にできます。 コマンド ラインから設定する場合は、RTTI を無効にするには -RT- オプションを使用し、有効にするには -RT オプションを使用します。
RTTI が無効になっている場合や、typeid の引数が、非多態クラスのポインタや参照である場合、typeid は、const type_info 型オブジェクト(そのポインタや参照の宣言済みの型を表し、そのポインタや参照のバインド先となる実際のオブジェクトを表すのではない)の参照を返します。
さらに、RTTI が無効になっている場合でも、特定のクラスのすべてのインスタンスとそのクラスのすべての派生クラスに、(必要に応じて)多態性の実行時型情報を提供させることができます。それには、そのクラスの定義で __rtti キーワードを使用します。
実行時型情報が無効になっているときに、いずれかの基底クラスが __rtti と宣言されている場合は、多態性の基底クラスすべてに __rtti を宣言しなければなりません。
struct __rtti S1 { virtual s1func(); }; /* Polymorphic */ struct __rtti S2 { virtual s2func(); }; /* Polymorphic */ struct X : S1, S2 { };
RTTI メカニズムを無効にしている場合、派生クラスで型情報を利用できないこともあります。 あるクラスが複数のクラスを継承している場合、基底クラスの順番と型によって、そのクラスが RTTI 機能を継承するかどうかが決まります。
多態クラスと非多態クラスが混在している場合は、継承の順番が重要になります。 RTTI が無効になっているときに、次のような宣言をコンパイルする場合は、__rtti 修飾子を付けて X を宣言しなければなりません。 さもないと、クラス X の基底クラスの順番を入れ替えたときに、"RTTI の基底クラス 'S1' から RTTI でないクラスを派生させることはできません" というコンパイル エラーが発生します。
struct __rtti S1 { virtual func(); }; /* Polymorphic class */ struct S2 { }; /* Non-polymorphic class */ struct __rtti X : S1, S2 { };
メモ: クラス X は、明示的に __rtti を付けて宣言されています。 こうすれば、クラスの順番や型が混在しても安全です。
次の例では、クラス X は非多態クラスのみを継承しています。 クラス X を __rtti と宣言する必要はありません。
struct __rtti S1 { }; // Non-polymorphic class struct S2 { }; struct X : S2, S1 { }; // The order is not essential
__rtti キーワードを使用しても、 RTTI を有効にしても、静的クラスを多態クラスにすることはできません。