非表示の vtordisp 構築または破棄ディスプレイスメント メンバーの追加を制御します。
vtordisp
pragma は C++ 固有です。
構文
#pragma vtordisp([push,] n)
#pragma vtordisp(pop)
#pragma vtordisp()
#pragma vtordisp([push,] {on|off})
パラメーター
push
現在の vtordisp 設定を内部コンパイラ スタックにプッシュし、新しい vtordisp 設定を n に設定します。
n を指定しない場合、現在の vtordisp 設定は変更されません。
pop
内部コンパイラ スタックから先頭レコードを削除し、vtordisp 設定をその削除したレコードの値に戻します。
n
vtordisp 設定の新しい値を指定します。 指定できる値は 0、1、2、/vd0 に対応する /vd1、/vd2 のコンパイラ オプションです。 詳細については、/vd (コンストラクション ディスプレイスメントの無効化) を参照してください。
on
これは、#pragma vtordisp(1) に相当します。
off
これは、#pragma vtordisp(0) に相当します。
解説
vtordisp
pragma は、仮想基底クラスを使用するコードだけに適用されます。 派生クラスが仮想基底クラスから継承する仮想関数をオーバーライドする場合、および派生クラスのコンストラクターやデストラクターが仮想基底クラスへのポインターを使用してその関数を呼び出す場合、コンパイラは仮想基底クラスを含むクラスに追加の vtordisp 隠しフィールドを導入する場合があります。
vtordisp
pragma は後続のクラス レイアウトに影響します。
/vd0、/vd1、/vd2 の各コンパイラ オプションは、モジュール全体に同じ動作を指定します。
0 または off を指定すると、vtordisp 隠しメンバーが抑制されます。
vtordisp は、クラスのコンストラクターとデストラクターが this ポインターによって指されるオブジェクトに対して仮想関数を呼び出す可能性がない場合にのみオフにします。
既定の 1 または on を指定すると、必要に応じて vtordisp 隠しメンバーが有効になります。
2 を指定すると、仮想関数を持つすべての仮想ベースの非表示 vtordisp メンバーが有効になります。
#pragma vtordisp(2) は、部分的に構築されたオブジェクトの dynamic_cast が適切に動作することを保証するために必要になる場合があります。 詳細については、「コンパイラの警告 (レベル 1) C4436」を参照してください。
引数のない #pragma vtordisp() は、vtordisp 設定を初期設定に戻します。
#pragma vtordisp(push, 2)
class GetReal : virtual public VBase { ... };
#pragma vtordisp(pop)