2012-04-14 21 views
0

私は、C++で複数の仮想/非仮想継承の概念を把握しようとしています。クラスBとクラスCがクラスAから事実上継承すると正しく理解すると、それらはある種のシングルトンオブジェクトを共有します。つまり、共通オブジェクトAの同じフィールドにアクセスします。複数の継承はBオブジェクトとCオブジェクトに対して別々のAオブジェクトを作成します。仮想と非仮想多重継承(C++)

これを考慮すると、誰でもそんなに親切であり、簡単で実用的な文脈でそれを提示するだろうか?なぜ最初に多重継承をしたのですか?なぜ仮想/非仮想ですか?

ありがとうございました。

+0

C++プログラミングについて何をお読みになりましたか?多重継承または仮想継承は扱いにくいので、避けるべきです。そして問題は、BとCの両方から継承するクラスDのためです。 –

+0

今私はそれを勉強しています、私は基本的な紹介しかありませんでした。私は間違いなく誰かがあなたがどちらかを使用する理由についての簡単な例を与えることができれば、より良くなるだろう。私は複雑な/境界線の場合は必要ありません。単純な基本的なシナリオは、1つの文で完璧なものになります。 – Bober02

+0

私はめったに多重継承または仮想継承を使用する必要はありません。良いルールは決してそれを使用しないことです。 –

答えて

4

多重継承はしばしばused in C++ではありません。ほとんどの場合、それはインターフェイス/実装のミックスインです。それも禁止されていません。 (仮想)多重継承の必要性がある一般的な基本クラスから派生するために、設計上の決定から来ている:

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 ... */ }; 

これらのダイヤモンド型の継承グラフは、ライブラリの実装によって予見されなければなりません。 virtualが存在しない場合は、2つのベースWindowオブジェクトがあります。virtualは1つのみですが、シングルトンではないため、多くのウィンドウが存在する可能性があります。

ライブラリは多くの場合(すべての場合ではなく)avoidです。 composite design patternを実装することによって、「ファット」基本クラスを持つこと、抽象的なインターフェイスクラスを実装すること、または特質/ポリシー付きテンプレートを使用することによって実現できます。

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