0

私はC++の人ではありませんが、これについて考えることを余儀なくされています。C#で多重継承ができないのに、なぜC ++で多重継承が可能なのですか?(私は菱形継承問題を知っていますが、それは私がここで求めていることではありません)。C ++は、複数の基本クラスから継承された同じメソッドシグネチャのあいまいさをどのように区別しますか?そして、なぜ同じデザインをC#に組み込むことができないのですか?

4

4 に答える 4

4

これは選択の問題です。C#言語デザイナーのAnders Hejlsbergは、言語から多重継承を除外することを選択しました。なぜだろうと思うかもしれません...私の推測では、(1)多重継承はしばしば必要とされない、(2)多重継承はしばしば間違った方法で使用される(非常に多くのオブジェクト指向構造のように)そして(3)それは言語および/またはコンパイラおよび/または静的チェックは不必要に複雑です。

CLR自体は多重継承を妨げません。したがって、C++。NETで使用できます。

于 2013-01-29T12:27:02.493 に答える
3

JavaまたはC#は、言語に組み込まれた設計上の決定であるため、使用できません。同意するかどうかにかかわらず、言語設計者は、C ++で行われるように、実装の多重継承の難しさはコストに見合わないと判断しました。

C ++は、1995年に作成したときに、実装の多重継承をすでに許可していました。

その選択は1995年にJavaによって行われました。C#は同じ理由で後でそれに続きました。

JavaとC#の両方で、必要な数のインターフェイスを実装できることを指摘しておきます。問題となるのは、実装の多重継承です。

C ++が実装の多重継承をどのように明確にするかについては、私よりも最近その言語を使用した他の人に答えを残しておきます。

于 2013-01-29T12:27:13.320 に答える
0

「死のダイヤモンド」のあいまいさは、仮想継承を使用して解決されます。ウィキペディアの記事は、他の記事と同じくらい良い説明です。 仮想継承

また、クラス階層をより適切に設計することで解決される可能性もあります。経験則として、複数のインターフェイス(C ++では純粋な抽象クラス)を継承している限り、多重継承は問題ありません。

于 2013-01-29T12:32:25.413 に答える
0

msdn.micosoftリンクから

多重継承はC++でサポートされています。ただし、Javaを含む他のほぼすべての最新のオブジェクト指向言語は、多重継承を許可しないことを選択しています。(Eiffelなどの一部の高度な言語は、多重継承のねじれを解決しようとしました)

多重継承の最大の問題は、コンパイラが仮想メソッドの正しい実装を見つける必要があるときにあいまいさを許容することです。

したがって、物事を単純にするために、JavaとC#の作成者は多重継承を許可しないことにしました。ただし、インターフェースと呼ばれる多重継承の代替手段があります

したがって、これらすべての問題を念頭に置いて、設計者は言語での多重継承を許可しませんが、それでも言語はインターフェースのような他の方法でそれをサポートします。上記の回答とリンクに加えて、c#が多重継承をサポートしていない理由も確認できます

于 2013-01-29T12:49:40.917 に答える