1.彼はダイヤモンドを継承?
2つのサブクラスは、同じ親クラスとサブクラスを継承し、2つのサブクラスがある継承し、彼らはショー上の図を言います。
コードの表示
問題は、基底クラスのスコープのための呼び出しは状況を説明するというあいまいさの問題を生成します:
D * PD =新しいD;
PD-> B :: = 1。
PD-> C :: A = 2。
printf( "%dの\ n" は、PD-> B ::)。
printf( "%D \ n" は、PD-> C :: A)。
2つの等価基底クラスがありますが、これは、呼び出すことがより困難私たちが望む結果ではなく、クラスのメモリリソースの無駄ではないことがあります。
この構造は、示されている:
仮想関数テーブルの位置の参照点A、すなわち、2つのインスタンスの基底クラスがあり、同じではありません!
2.どのように解決するには?
仮想継承を使用してください!
コードの表示
メモリレイアウト:
2基底クラスについては、B、Cのラインは、その対応する必要があるか仮想テーブルの上に仮想関数を呼び出すために何が起こるかを考えてみてオブジェクトをインスタンス化する、基底クラスで共通、です!点B、Cに対応する仮想テーブルが、それは、上記の構成になります。
!のデバッグはそれが本当にケースで、観測
概要:あなたは仮想継承、仮想継承によって曖昧削除することができますが、コストは、仮想関数ポインタを高めることです。