継承キーワード

Microsoft 固有の仕様

class class-name
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 はまだ定義されていません。宣言されているだけです。 コンパイラがこのようなポインターを検出した場合、そのポインターの汎化表現を作成する必要があります。 この表現のサイズは、指定した継承モデルによって異なります。 コンパイラに継承モデルを指定するには次の 3 つの方法があります。

  • コマンド ラインで、/vmg スイッチを使って指定する

  • pointers_to_members pragma を使って指定する

  • 継承キーワード __single_inheritance__multiple_inheritance__virtual_inheritance を使って指定する。 この手法により、クラス単位で継承モデルを制御します。

    Note

    常にクラスを定義した後で、そのクラスのメンバーへのポインターを宣言する場合は、これらのオプションを使用する必要がありません。

クラスを定義する前にそのクラスのメンバーへのポインターを宣言する場合は、その結果の実行可能ファイルのサイズと速度に悪影響を及ぼす可能性があります。 クラスで使用する継承が複雑になるほど、そのクラスのメンバーへのポインターを表すために必要なバイト数が多くなります。 したがって、そのポインターの解釈に必要なコードも大きくなります。 単一継承 (または継承なし) は最も簡素で、仮想継承は最も複雑です。 クラスを定義する前に宣言するメンバーへのポインターでは、常に最も大きく最も複雑な表現が使用されます。

上記の例を次のように変更します。

class __single_inheritance S;
int S::*p;

指定したコマンドライン オプションや pragma に関係なく、class S のメンバーへのポインターでは、可能な限り小さい表現が使用されます。

Note

メンバーへのクラス ポインター表現の同じ前方宣言は、そのクラスのメンバーへのポインターを宣言する各翻訳単位で発生する必要があり、その宣言はメンバーへのポインターを宣言する前に発生する必要があります。

以前のバージョンとの互換性を確保するため、_single_inheritance_multiple_inheritance_virtual_inheritance は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__single_inheritance__multiple_inheritance__virtual_inheritance の同意語です。

Microsoft 固有の仕様はここまで

関連項目

キーワード