C ++クラスには、2種類のメンバー変数と3種類のメンバー関数があります。
オブジェクトのメモリレイアウトには非静的メンバー変数のみが含まれ、静的メンバー変数はグローバルデータ領域にあります。
C ++で継承されたクラスのタイプと、対応するクラスインスタンスのメモリレイアウトを以下に示します。
単一継承
継承状況は次のとおりです。
対応するオブジェクトメモリレイアウト:
2.一般に多重継承(非ダイヤモンド)
継承状況は次のとおりです。
対応するオブジェクトメモリレイアウト:
3.一般的な多重継承(ひし形)
クラス継承:
対応するオブジェクトメモリレイアウト:
4.単一の仮想継承
仮想継承は、ダイヤモンド継承の最も派生したクラスが間接的な親クラスの複数のインスタンスを持っている状況を解決します。仮想継承の派生クラスのメモリレイアウトは、通常の継承とは大きく異なり、主に以下に反映されます。
- 仮想継承のサブクラスの場合、新しい仮想関数がそれ自体で定義されている場合、コンパイラーは仮想関数ポインター(vptr)とその仮想関数テーブルを生成します。vptrはオブジェクトメモリの前面にあります。
- vs非仮想継承:親仮想関数テーブルを直接拡張します。
- 仮想継承のサブクラスも、親クラスのvprtおよび仮想関数テーブルを個別に保持します。コンテンツのこの部分は、4バイトの0で区切られます。
- 仮想継承のサブクラスオブジェクトには、4バイトの仮想テーブルポインターオフセット値が含まれています。
クラス継承:
対応するオブジェクトメモリレイアウト:
5.複数の仮想継承(ダイヤモンド)
クラス継承:
対応するオブジェクトメモリレイアウト:
参照:
1. https://www.cnblogs.com/QG-whz/archive/2015/10/25/4909359.html