C ++如何克服钻石问题?

时间:2013-01-29 12:22:20

标签: c# c++ multiple-inheritance

我不是C ++人,但我不得不考虑这个问题。为什么在C ++中我无法在C#中进行多重继承? (我知道钻石问题,但这不是我在这里问的问题)。 C ++如何区分从多个基类继承的相同方法签名的歧义?为什么同样的设计不能包含在C#中?

4 个答案:

答案 0 :(得分:4)

这是一个选择问题。 C#语言设计师Anders Hejlsberg选择将多重继承保留在语言之外。您可能想知道为什么......我的猜测是(1)通常不需要多重继承,(2)多重继承通常以错误的方式使用(如同许多面向对象的结构)和(3)它会使语言和/或编译器和/或静态检查不必要地复杂。

CLR本身不会阻止多重继承;因此,它可以在C ++ .NET中使用。

答案 1 :(得分:3)

你不能用Java或C#,因为它是一种内置于语言中的设计决策。无论你是否同意,语言设计者都认为在C ++中实现多重继承的困难并不值得花费。

当我在1995年编写它时,C ++已经允许多次继承实现。

这个选择是由Java在1995年做出的。随后C#也出于同样的原因。

我要指出Java和C#都允许您实现任意数量的接口。这是问题的多重继承实现。

我将留下答案,说明C ++如何消除多个实现继承的歧义,以及最近比我使用该语言的其他人。

答案 2 :(得分:0)

使用虚拟继承解决了“死亡钻石”中的模糊性。维基百科的文章和其他文章一样好。 Virtual Inheritance

通过更好地设计类层次结构,也可以解决这个问题。根据经验,只要您继承多个接口(在c ++中,纯抽象类),就可以进行多重继承。

答案 3 :(得分:0)

来自msdn.micosoft link

  

C ++支持多重继承。但是,几乎所有其他现代面向对象语言(包括Java)都选择不允许多重继承。 (某些高级语言,例如Eiffel,已尝试解决多重继承的问题)

     

多继承的最大问题是,当编译器需要找到虚拟方法的正确实现时,它允许模糊。

     

因此,为了保持简单,Java和C#的创建者决定不允许多重继承。但是,有一种替代多重继承,称为接口

因此,将所有这些问题牢记于设计者不会允许语言中的多重继承,但仍然语言以其他方式支持它,如接口。 除了以上答案&链接,您也可以查看why doesn't c# support multiple inheritance