多重継承が必要になるシナリオはありますか? 例を挙げてください。
6 に答える
他のOOP言語が持つインターフェースのようなものをシミュレートしたい場合は、複数の継承を使用する必要があります。
継承が「必要」で、単一のクラスで複数回使用したい、または単一のクラスに結合したいものは、多重継承が「必要」です。
継承を使用する一般的な C++ イディオムには、次のものがあります。
- 純粋仮想関数のみを含む抽象クラスを使用する Java スタイルのインターフェース
- CRTP ( http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern ) によるシミュレートされた動的バインディングを含むミックスイン、または
boost::noncopyable
. - ポリシーベースの設計 ( http://en.wikipedia.org/wiki/Policy-based_design )
- 型特性の提供
したがって、複数のインターフェースを実装する単一のクラスが必要な場合は、多重継承が必要です。ポリシーベースの反復子タイプが必要な場合は、複数の継承が必要です (ポリシー用に 1 回、特性用に 1 回)。
すべての場合において、同じ出力を持ち、多重継承を使用しないプログラムを作成できることは明らかであるため (「Turing complete だけが重要です」という引数を使用します)。ただし、Turing の完全性だけが重要なわけではありません。通常、Turing の入力と出力を備えたプログラムの概念を超えるソフトウェアを作成するという目標があります。ソースがどのように見えるかを気にします。だから「必要」。
純粋な抽象クラスを使用すると、JavaやC#の場合と同じようにインターフェイスを使用できます。
開発者が怠惰で、多重継承を必要としないより良いクラス設計を作成したくない場合;-)私は主にC#でコーディングし、単一継承のみを許可するという設計を呪うシナリオを見つけたことがありません。
そうは言っても、複数のインターフェースを実装できることは本当に便利です。
チューリングマシン以外のものが必要なシナリオはありません。
COM オブジェクトを構築する場合。