2011-08-24 4 views
0
class base{ 
public: 
    virtual void fn() { 

    } 
}; 

class der1 : public base { 
    void fn() { 

    } 
}; 

class der2 : public der1 { 
    virtual void fn() { 

    } 
}; 

私は別の質問があります。クラスder1の定義では、関数fnを再定義する際に「仮想」は言及していません。 Vテーブルを作成する際に何らかの効果がありますか次のコードで作成するVテーブルの数はいくつですか?

+3

別の質問がある場合は、別途質問することで、両方の回答を得ることができます。 –

+2

ゼロから「無限」のいずれかになります。 –

+0

私はあなたの質問を理解していない...どのようなVのテーブル(あなたはVと呼ばれる投稿に何もない)? – m0skit0

答えて

2

具体的な答えはありません。これは、コンパイラの実装の詳細としてVirtualismが残っていないためです。
C++標準では、vptrまたはvtableはまったく話されません。これに対する答えは、各コンパイラによって異なります。

3

すでに述べたように、vtableはコンパイラ/プラットフォーム固有の実装の詳細なので、一般的な答えはありません。

私は別の質問があります。クラスder1の定義では、関数fnを再定義するときに「仮想」とは言及していません。機能fn()基本クラスでvirtualとして定義されているので、Vテーブル

を作成しながら、全てのサブクラスの実装にかかわらず、それらがあるかどうかの、(従って基底クラスの実装をオーバーライド)定義により、仮想あり、それを任意の効果を有します明示的に宣言した。したがって、vtableにはそれらが含まれます(特定のコンパイラが生成する場合)。

base::fn()を純粋な仮想にすると簡単にテストできます。 der1::fn()という仮想が宣言された場合、der1をインスタンス化することができませんでした。

1

次のコードでは、いくつのVテーブルが作成されますか?

質問には答えられません。
あなたも知りたいと思いませんか、あなたは気にする必要はありません。あなたのコードがどのように使われているか、あるいは動作しているかに違いはありません。

私は別の質問があります。

Okリッスンします。

クラスder1の定義では、関数fnを再定義するときに「仮想」は言及していません。

'void fn()'の定義は基本クラスとまったく同じであるため、オーバーライドしている関数の仮想属性を継承します。したがって、それも仮想です。

V表を作成している間に指示する方法はありませんそれをどんな効果があります。 V-TableはC++言語とは何の関係もないので(V-tableを使用していても)、コンパイラがコードの背後で行うことです。

3

C言語ではvテーブルは言及していませんが、これは比較的単純で効率的なので、すべての主要なコンパイラで使用される実装の詳細です(そのように使用されているため、 )。

これは典型的な答えは、仮想関数を含むクラスごとに1つのvテーブルがあるということです。使用されていないことが判明した場合は、一部を最適化することができます。

通常、インスタンス化できない抽象クラス用のvテーブルを生成する必要はありません。しかし、コンストラクタとデストラクタで仮想関数を呼び出すことは可能ですが(効果は必ずしも期待通りではありませんが)、コンパイラは通常vテーブルを生成し、単に純仮想関数のエントリをヌルに設定します。

したがって、回答は、おそらく3です。

以下は、Itanium C++ ABIを実装するGCCなどのコンパイラを示しています。

あなたが実際に(V-テーブルとtypeinfoの記号は仮想関数を持つクラス用に生成されている)ライブラリーを生成し、シンボルをダンプすることで、この3を確認することができます。

$ nm somelib.so | grep Foo 
00000000012a48b0 V _ZTIN3FooE 
0000000000e0fca0 V _ZTSN3FooE 
00000000012a4620 V _ZTVN3FooE 

$ nm somelib.so | grep Foo | c++filt 
00000000012a48b0 V typeinfo for Foo 
0000000000e0fca0 V typeinfo name for Foo 
00000000012a4620 V vtable for Foo 

を探すための接頭辞が_ZTIN_ZTSNありますtypeinfo,typeinfo nameおよびvtableの場合は_ZTVNです。

関連する問題