2009-08-02 6 views
1

基本クラスが1つで、それから10種類のコンクリート派生クラスを派生させた場合、それぞれのコンクリート派生クラスはそれぞれ異なるvtableを持ちますか?派生コンクリートクラスのvtables

+0

どの言語/ランタイム/コンパイラなど? –

+0

私の推測はC++です。これは、仮想メソッドと非仮想メソッドの両方を持つ唯一の一般的な言語です。 – EFraim

+0

なぜこのタグは主観的なものですか? –

答えて

0

派生クラスが仮想メソッドをオーバーライド/宣言するかどうかによって異なります。

4

派生クラスの基本クラスまたはすべてに仮想関数がある場合は、通常はyesです。どうしてそれが重要ですか?

2つのクラスは、仮想関数のインテンシカルセットを持つ場合にのみvtableを共有できます。 派生クラスは、仮想関数をオーバーライドしない場合にのみ、基本クラスとvtableを共有できます。

派生クラスは、両方とも同じ基本クラスの関数をオーバーライドしない限り、他の派生クラスとvtableを共有できません。同様の方法で実装されていても、派生クラスのメンバ関数は別の派生クラスのメンバ関数とは異なる型です。

+0

私はちょうど混乱していたすべての派生クラスは、単一のvテーブルを使用するか、彼らは別のものを持つだろう –

+0

はい、実際にすべての派生クラスは、独自の仮想関数を乗り越えている基本クラスは純粋に抽象的なのでv表 –

+3

vtableは、仮想関数のインテンシカルなセットを持つ場合にのみ共有できます。つまり、派生クラスは仮想関数をオーバーライドしない場合にのみ、基本クラスとvtableを共有できます。 –