0

私は現在、C ++での複数の仮想/非仮想継承の概念を理解しようとしています。クラス B と C がクラス A から実質的に継承されているかどうかを正しく理解している場合、それらは一種のシングルトン オブジェクトを共有します。つまり、両方とも 1 つの共通オブジェクト A の同じフィールドにアクセスします。多重継承は、任意の B および C オブジェクトに対して個別の A オブジェクトを作成します。

上記を考慮して、誰かがとても親切で、シンプルで実用的な文脈でそれを提示しますか? そもそもなぜ多重継承なのか、次になぜ仮想/非仮想なのか?

ありがとう。

4

1 に答える 1

4

多重継承は、C++ ではあまり使用されません。ほとんどの場合、インターフェース/実装のミックスインです。それも禁止ではありません。(仮想) 多重継承の必要性は、1 つの一般的な基本クラスから派生するという設計上の決定から生じます。

class Window 
{ /* draw, show, hide, background ... */ };

class WindowWithBorder : public virtual Window 
{ /* methods to manipulate / draw border ... */ };

class WindowWithMenu : public virtual Window
{ /* methods to manipulate / draw Menu ... */ };

class MyWindow : public WindowWithBorder, public WindowWithMenu
{ /* now it's your turn ... */ };

これらのひし形の継承グラフは、ライブラリの実装者が予測する必要があります。多くのウィンドウが存在する可能性があるため、シングルトンではなく、1 つだけのvirtualベースWindowオブジェクトが 2 つ存在することになります。virtual

ライブラリは、多くの場合 (すべての場合ではありません) 、そのような状況を回避できます。たとえば、複合設計パターンを実装する、「太い」基本クラスを持つ、抽象インターフェイス クラスを実装する、または特性/ポリシーを備えたテンプレートを使用することによってです。

Bjarne Stroustrup のThe C++ Programming languageのクラス階層に関する章を読むことをお勧めします(私の第 3 版の第 15 章、例を借りました)。

于 2012-04-14T18:49:24.840 に答える