C++のvtableは、仮想関数を呼び出したときに実行するコードセクションを決定するためにのみ使用されますか、または実行時に他の用途を持っていますか?ウィキペディアでC++(仮想)関数テーブル
それは理由として、「ダイナミックディスパッチ」を示していますが、C++のために、さらに詳細には触れません.....
C++のvtableは、仮想関数を呼び出したときに実行するコードセクションを決定するためにのみ使用されますか、または実行時に他の用途を持っていますか?ウィキペディアでC++(仮想)関数テーブル
それは理由として、「ダイナミックディスパッチ」を示していますが、C++のために、さらに詳細には触れません.....
いくつかの実装では、RTTIコード(typeid
、dynamic_cast
によって使用される情報へのポインタを置きます、...)をvtableのスロットに挿入します(g ++ ABIのベースとなるItanium ABIについてはこちらを参照してください)。
(あなたは、Itanium ABI仕様を読めば、実際、それはもう少し複雑ですが、これは一般的な考え方である)また
、あなたがリンクされたドキュメントから見ることができるように、アクセスするためのいくつかのより多くのものがあります古典的な単一継承シナリオのように、 "複雑な"オブジェクト階層(多重継承、仮想基本クラス、...)で必要とされるほとんどのものは、ベースクラスのメソッドを呼び出すときにポインタ調整を行います。派生クラスのレイアウトは単純で、このような騒ぎをすべて必要としません。
テーブルには仮想関数だけがリストされ、他のタイプの関数はありません。 – user997112
なぜ非仮想関数をリストする必要がありますか? –
まあ、いくつかの動的ディスパッチイベントは仮想ではないでしょうか? (文ではなく質問) – user997112
C++ vtableは、単に関数ポインタのルックアップテーブルです。特定のC++実装であれば、vtableを他のものに使うことができます。それは実装(およびバージョン)固有のものです。あなたの仮想メソッドを呼び出すC + +以外のもののためにvtableに依存することは本当に悪い考えです。
実際には、C++標準ではvtableや仮想関数などの実装について言及していないので、vtableの存在にも頼るべきではありません。 –
私は、仮想基本クラスのサブオブジェクトのオフセットを記述するために使用することもできると思います。 –