2016-10-05 4 views
-4

デフォルトのコンストラクタでは、vptr(仮想テーブルポインタ)とvtable(仮想テーブル)のみを作成できるのはなぜですか?パラメータコンストラクタができない理由C++でのvptrとvtableの概念

+1

*「なぜvptr(Virtual Table Pointer)とvtable(Virtual Table)を作成できるのはデフォルトのコンストラクタだけですか?それは意味をなさない。 –

+0

コンストラクタは仮想anythingsを作成しません。型の中に仮想関数を持たせることで型を多相にしますが、それはコンパイル時のことであり、どのようなコンストラクタとは関係ありません。 – xaxxon

答えて

5

最初に、vtableとvptrsはC++言語標準では指定されていません。

これは実装の詳細ですが、現存するすべてのC++実装では、仮想関数ディスパッチを実装するためにこの手法を使用しています。

すべて仮想メンバー機能を持つクラスのコンストラクタは、必ずオブジェクトのvptrを確立します。それなしではうまくいかないでしょう。だから…

&hellipになぜパラメータコンストラクタができません。単に間違った前提です。

+3

また、* no *コンストラクタはvtableを作成します。 –

0

実装では、vtables(「Cheers and hth-Alf」で述べたようにかなり一般的な実装の選択肢)を使用すると仮定すると、vtableの作成/投入とコンストラクタの呼び出しは別個の操作です。

ただし、与えられた(非抽象クラスの)すべてのインスタンスは、一度構築されると、同じセットのvtableを持ちます(複数のベースから継承するクラスは複数のvtableを持つことがあります)。オブジェクトがどのように構築されるか(例えば、どのパラメータがコンストラクタに渡されるか、どのコンストラクタが呼び出されるか、など)に応じて、異なるvtableは確かに存在しない。