C ++ダイヤモンド継承の問題と解決策

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に対応する仮想テーブルが、それは、上記の構成になります。

!のデバッグはそれが本当にケースで、観測
ここに画像を挿入説明
概要:あなたは仮想継承、仮想継承によって曖昧削除することができますが、コストは、仮想関数ポインタを高めることです。

公開された239元の記事 ウォンの賞賛3 ビュー3143

おすすめ

転載: blog.csdn.net/it_xiangqiang/article/details/105177007
おすすめ