さて、ではMix-inとはなんでしょうか。

Mix-inは方法論であり、クラス実装上の技術の事です。多重継承を行う代わりに、単一継承と、Mix-inクラスと言う、決められた形式で実装されたクラスを継承をする事をMix-in継承と呼びます。

以下の2つの条件を果たしたクラスがMix-inクラスと呼ばれます。

インスタンスを持たないクラス(抽象クラス)である
・Mix-inクラスのみを継承する

 抽象クラスというのは、実装はあるがインスタンスを作る事が出来ないという、クラスとインターフェイスの中間のようなクラスの事をさします。
 ちなみにC++で抽象クラスを確実に実現する方法はありません*1。これは運用ルールで解決するしかないです*2

 これにより、継承を「実装の単一継承と、抽象クラスのMix-in継承」のみにします*3。そうすると、継承図は常に常に親から子へ1本の線が引かれ、ところどころで接木のようにMix-inクラスが入る事になります。これによって多重継承の管理が大幅に楽になる(と考えられます)。

 さて、これだけでは1のダイアモンド継承の問題しか解決できません(実際にはそれすらも解決してないのですが、もつれた糸が実用レベルまで解けたのは確かです)。2の名前衝突については、rubyでは「継承元クラスのメソッドを無かったことにする」「メソッドの名前を変える」など色々凄い事が可能で、それによって名前衝突を回避しています。
 C++では逆立ちしたってこんな事出来ないので、集約でごまかすしかないですね(クラスポリモーフィズムは失われますが)。まあメソッドの名前変えたらポリモーフィズムが機能しないんじゃないかという危惧がありますがその辺はよくわかりません^^;

 とまあ、みはえるが把握したMix-inの機能についてはこの辺までです。間違っていたら順次修正します^^;;。

*1:純粋仮想デストラクタは、デストラクタの実装が必要な場合に作れません

*2:javarubyには構文が用意されています

*3:インターフェイス継承はそもそも継承からの脱却が目的なので本論には含めません。重要なファクタではあるのですが