次の方法で共有


継承キーワード

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 固有の仕様

参照

関連項目

C++ キーワード