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