vtordisp
pragma
非表示の 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)