/vd (ディスプレイスメントの無効化)
構文
/vdn
引数
0
vtordisp コンストラクター/デストラクターのディスプレイスメント メンバーを非表示にします。 このオプションは、すべてのクラス コンストラクターとデストラクターが仮想的に仮想関数を呼び出すことが確実な場合にだけ選択してください。
1
非表示の vtordisp コンストラクター/デストラクターのディスプレイスメント メンバーの作成を有効にします。 この選択が既定です。
2
構築中のオブジェクトに対して dynamic_cast 演算子を使用できるようになります。 例: 仮想基底クラスから派生クラスへの dynamic_cast など。
/vd2 を指定すると、仮想関数を含んだ仮想基底クラスがある場合に、vtordisp フィールドが追加されます。 /vd1 で十分です。 /vd2 が必要となる最も一般的なケースは、仮想基底クラス内の唯一の仮想関数がデストラクターである場合です。
解説
これらのオプションは、仮想基底クラスを使用する C++ コードにのみ適用されます。
Visual C++ では、仮想継承が使用される場合、C++ のコンストラクション ディスプレイスメントが実装されます。 コンストラクション ディスプレイスメントは、仮想基底クラスで宣言され、派生クラスでオーバーライドされた仮想関数が、さらなる派生クラスの構築時にコンストラクターから呼び出された場合に起こる問題を解決するものです。
その問題とは、クラスの仮想基底クラスへの変位と、その派生クラスへの変位との間の差が原因で、仮想関数に誤った this
ポインターが渡される可能性があるということです。 このソリューションでは、クラスの各仮想基底クラスに対して、vtordisp フィールドと呼ばれる 1 つの構築変位調整が提供されます。
既定では、コードでユーザー定義のコンストラクターとデストラクターが定義され、仮想基底クラスの仮想関数もオーバーライドされている場合に、vtordisp フィールドが必ず導入されます。
これらのオプションは、ソース ファイル全体に影響します。 vtordisp を使用すると、vtordisp フィールドをクラス単位で無効化したり、再度有効化したりできます。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[追加のオプション] ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- 以下を参照してください。AdditionalOptions