/vd (ディスプレイスメントの無効化)
更新 : 2007 年 11 月
/vd は、Visual C++ の初期のバージョンで見られた不正な動作をサポートしますが、これは不要になりました。
/vdn
引数
0
vtordisp コンストラクタ/デストラクタ ディスプレイスメント メンバを無効にします。このオプションは、すべてのクラス コンストラクタとデストラクタが仮想的に仮想関数を呼び出すことが確実な場合にだけ、選択してください。1
隠し vtordisp コンストラクタ/デストラクタ ディスプレイスメント メンバの作成を有効にします。これは、既定の設定です。2
構築中のオブジェクトで dynamic_cast Operator を使用できます。仮想基本クラスから派生クラスへの dynamic_cast はその一例です。/vd2 は、仮想関数を持つ仮想基本クラスがあるときに vtordisp フィールドを追加します。/vd1 でも十分です。/vd2 が必要となる最も一般的なケースは、仮想基本クラス内の唯一の仮想関数がデストラクタである場合です。
解説
次のオプションは、仮想基本クラスを使用する C++ コードだけに適用されます。
Visual C++ では、仮想継承に対して C++ ディスプレイスメントをサポートしています。ディスプレイスメントを使用すると、仮想基本クラスで宣言され、派生クラスでオーバーライドされた仮想関数が、さらに派生したクラスの構築中にコンストラクタから呼び出されたときに発生する問題を解決できます。
この問題は、基本クラスとその派生クラスとの間で仮想基本クラスの位置が異なるために、不当な this ポインタが仮想関数に渡されることが原因です。この問題を解決するために、各仮想基本クラスに対して vtordisp フィールドと呼ばれる単一のディスプレイスメントがサポートされています。
既定では、コード内でユーザー定義のコンストラクタとデストラクタの両方が定義され、仮想基本クラスの仮想関数がオーバーライドされている場合は、必ず vtordisp フィールドが挿入されます。
/vdn オプションは、ソース ファイル全体に反映されます。vtordisp を使用すると、vtordisp フィールドをクラス単位で無効化したり、再度有効化したりできます。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダをクリックします。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション]ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- AdditionalOptions を参照してください。