__rtti,-RT オプション
カテゴリ (__rtti keyword)
修飾子,C++ の拡張キーワード,C++ 特有のキーワード
解説
実行時型情報(RTTI)がデフォルトで有効になっています。[プロジェクトオプション]ダイアログボックスの[C++]ページで,RTTI を無効にできます。コマンドラインから無効にする場合は -RT- オプション,有効にする場合は -RT を使います。
RTTI を無効にした場合,または typeid の引数がポインタまたは非多態性のクラスへの参照の場合は,typeid が返す const typeinfo オブジェクトへの参照は,宣言されているポインタまたは参照の型を表しており,ポインタや参照が結合している実際のオブジェクトを表しているわけではありません。
実行時型情報が無効である場合に,クラス定義で __rtti キーワードを使うことによって,特定のクラスおよびそのクラスから派生したすべてのクラスのインスタンスに,適切な位置で多態性の実行時型情報を提供させることができます。
基本クラスを __rtti と宣言している場合に -RT- コンパイラオプションを使うときは,多態性の基本クラスすべてで同じように __rtti を宣言する必要があります。
struct __rtti S1 { virtual s1func(); }; /* 多態性 */ struct __rtti S2 { virtual s2func(); }; /* 多態性 */ struct X : S1,S2 { };
RTTI 機構をオフにすると,派生クラスで RTTI が使えなくなることがあります。複数のクラスから 1 つのクラスへ派生する場合,基本クラスの順序と型によって,クラスが RTTI 機能を継承するかどうかが決まります。
多態性クラスと非多態性クラスが存在する場合,継承の順序が重要な意味を持ちます。次の宣言を RTTI なしでコンパイルする場合は,__rtti 修飾子を付けて X を宣言する必要があります。この修飾子を付けていないと,クラス X の基本クラスの順序を入れ換えた場合に,コンパイル時に「Can't inherit non-RTTI class from RTTI base 'S1'(RTTI 基本クラス 'S1' からは,RTTI ではないクラスを継承できない)」のエラーが発生します。
struct __rtti S1 { virtual func(); }; /* 多態性クラス */ struct S2 { }; /* 非多態性クラス */ struct __rtti X : S1,S2 {};
メモ: クラス X は __rtti を付けて明示的に宣言します。こうすると,クラスの型が混在していても,順序を入れ換えても安全です。
以下の例では,クラス X は非多態性クラスのみを継承します。したがって,クラス X の宣言に __rtti を付ける必要はありません。
struct __rtti S1 { }; // 非多態性クラス struct S2 { }; struct X : S2,S1 { }; // 順序は重要でない
__rtti キーワードを使っても,RTTI を有効にしても,静的クラスは多態性クラスになりません。