web-dev-qa-db-ja.com

複数または仮想継承とvtableの下でのクラスのメモリレイアウト?

私は「C++オブジェクトモデルの内部」を読んでいて、vtablesを介して複数の仮想継承がどのように達成されるかを理解しようとしています(私は一塩基多型を完全に理解しています)。

実行するオフセット計算が多いため、仮想継承中またはキャスト中にメソッドを配置する必要がある場合に、正確に何が行われるのかを理解するのに苦労しています。

複数または仮想継承の例で複数のvtableがどのように使用されているかを理解するのに役立つ人はいますか?レイアウトと問題を理解できれば、おそらくこの問題をよりよく理解できるでしょう。

15
mezamorphic

C++の実装では、通常、vtablesを使用して仮想関数を実装します。 vtableは、関数へのポインタのテーブルです。仮想関数を持つクラスの各オブジェクトには、クラスのすべての仮想関数のアドレスを含むvtableへの非表示のポインターがあります。

仮想関数を呼び出すとき、コードはvtable内の関数ポインターのオフセットを計算し、そこに格納されているアドレスの関数を呼び出します。

enter image description here

基本クラスの派生クラスがvirtuall関数をオーバーライドする場合、そのクラスの仮想テーブルは、元の関数ではなく、オーバーライドされた関数を指すだけです。

この 優れた記事で説明されています 単一継承と多重継承の両方でどのように機能するかを詳しく説明しています。

16
Christophe