継承キーワード
Microsoft 固有の仕様 →
class [__single_inheritance] class-name;
class [__multiple_inheritance] class-name;
class [__virtual_inheritance] class-name;
それぞれの文字について以下に説明します。
- class-name
宣言するクラスの名前。
C++ では、クラスを定義する前にクラス メンバーへのポインターを宣言できます。 次に例を示します。
class S;
int S::*p;
上記のコードでは、p は、クラス S の整数メンバーへのポインターとして宣言しています。 ただし、class S は、このコードでまだ定義されていません。宣言されているだけです。 コンパイラがこのようなポインターを検出した場合、そのポインターの汎化表現を作成する必要があります。 この表現のサイズは、指定した継承モデルによって異なります。 コンパイラに継承モデルを指定するには 4 つの方法があります。
IDE の [pointer-to-member 表現] で指定する
コマンド ラインで、/vmg スイッチを使って指定する
pointers_to_members プラグマを使って指定する
継承キーワード __single_inheritance、__multiple_inheritance、および __virtual_inheritance を使って指定する この手法により、クラス単位で継承モデルを制御します。
注意
常にクラスを定義した後で、そのクラスのメンバーへのポインターを宣言する場合は、これらのオプションを使用する必要がありません。
クラスを定義する前に、そのクラスのメンバーへのポインターを宣言すると、作成される実行可能ファイルのサイズと速度に影響を与えます。 クラスで使用する継承が複雑になるほど、そのクラスのメンバーへのポインターを表すために必要なバイト数が多くなります。したがって、そのポインターの解釈に必要なコードも大きくなります。 単一継承は最も簡素で、仮想継承は最も複雑です。
上記の例を次のように変更します。
class __single_inheritance S;
int S::*p;
この場合、コマンド ライン オプションやプラグマに関係なく、class S のメンバーへのポインターは最小サイズの表現を使用します。
注意
メンバーへのクラス ポインター表現の同じ前方宣言は、そのクラスのメンバーへのポインターを宣言する各翻訳単位で発生する必要があり、その宣言はメンバーへのポインターを宣言する前に発生する必要があります。
END Microsoft 固有の仕様