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
です。
別の質問がある場合は、別途質問することで、両方の回答を得ることができます。 –
ゼロから「無限」のいずれかになります。 –
私はあなたの質問を理解していない...どのようなVのテーブル(あなたはVと呼ばれる投稿に何もない)? – m0skit0