Microsoft 固有の仕様
classclass-name
class __single_inheritanceclass-name
class __multiple_inheritanceclass-name
class __virtual_inheritanceclass-name
どこで:
class-name
宣言されているクラスの名前。
C++ では、クラスの定義の前にクラス メンバーへのポインターを宣言できます。 例えば次が挙げられます。
class S;
int S::*p;
上記のコードでは、 p はクラス S の整数メンバーへのポインターとして宣言されています。ただし、 class S はまだこのコードで定義されていません。宣言されているだけです。 コンパイラは、このようなポインターを検出すると、ポインターの一般化された表現を作成する必要があります。 表現のサイズは、指定された継承モデルによって異なります。 コンパイラに継承モデルを指定するには、次の 3 つの方法があります。
/vmgスイッチを使用してコマンド ラインでpointers_to_membersプラグマの使用継承キーワードの
__single_inheritance、__multiple_inheritance、および__virtual_inheritanceの使用。 この手法では、クラスごとに継承モデルを制御します。注
クラスを定義した後、クラスのメンバーへのポインターを常に宣言する場合は、これらのオプションを使用する必要はありません。
クラスが定義される前にクラス メンバーへのポインターを宣言すると、結果の実行可能ファイルのサイズと速度に悪影響を及ぼす可能性があります。 クラスで使用される継承が複雑になるほど、クラスのメンバーへのポインターを表すために必要なバイト数が多くなります。 また、ポインターを解釈するために必要なコードが大きくなります。 単一 (またはまったく) の継承は最も複雑でなく、仮想継承は最も複雑です。 クラスが定義される前に宣言するメンバーへのポインターは、常に最も大きく、最も複雑な表現を使用します。
上記の例が次に変更された場合:
class __single_inheritance S;
int S::*p;
指定したコマンド ライン オプションまたはプラグマに関係なく、 class S のメンバーへのポインターは、可能な限り最小の表現を使用します。
注
クラス ポインターからメンバーへの表現の同じ前方宣言は、そのクラスのメンバーへのポインターを宣言するすべての変換単位で行う必要があり、宣言はメンバーへのポインターが宣言される前に発生する必要があります。
以前のバージョンとの互換性のために、コンパイラ オプション /Za(言語拡張機能を無効にする) が指定されていない限り、_single_inheritance、_multiple_inheritance、および_virtual_inheritanceは__single_inheritance、__multiple_inheritance、および__virtual_inheritanceのシノニムです。
Microsoft 固有の仕様はここまで