C ++ vtableは、仮想関数を呼び出すときにコードのどのセクションを実行するかを決定するためにのみ使用されますか、それとも実行時に他の用途がありますか?
ウィキペディアでは、理由として「動的ディスパッチ」がリストされていますが、C++の詳細については説明していません。
一部の実装では、RTTI コード ( typeid
、dynamic_cast
、...) で使用される情報へのポインターを vtable のスロットに配置します ( g++ ABI のベースとなっているItanium ABIについては、こちらを参照してください)。
(実際、Itanium ABI 仕様を読むと、もう少し複雑ですが、これが一般的な考え方です)
また、リンクされたドキュメントからわかるように、基本クラスのデータにアクセスしたり、基本クラスのメソッドを呼び出すときにポインター調整を実行したりするための機能がいくつかあります...、ほとんどが「複雑な」オブジェクト階層 (多重継承) で必要な機能です。 、仮想基底クラス、...)、古典的な単一継承のシナリオと同様に、派生クラスのレイアウトは単純であり、このような大騒ぎは必要ありません。
C++ vtable は、関数ポインターの単なるルックアップ テーブルです。特定の C++ 実装では、他の目的で vtable を使用できます。しかし、それは実装 (およびバージョン) 固有です。仮想メソッドを呼び出すために C++ 以外の vtable に依存することは、非常に悪い考えです。