我不是 C++ 人,但我不得不考虑这个问题。当我无法在 C# 中进行多重继承时,为什么在 C++ 中可以进行多重继承?(我知道钻石问题,但这不是我在这里要问的)。C++ 如何区分从多个基类继承的相同方法签名的歧义?为什么不能在 C# 中加入相同的设计?
4 回答
这是一个选择问题。C# 语言设计者 Anders Hejlsberg 选择将多重继承排除在语言之外。您可能想知道为什么...我的猜测是(1)通常不需要多重继承,(2)经常以错误的方式使用多重继承(就像许多面向对象的构造一样)以及(3)它会使语言和/或编译器和/或静态检查不必要地复杂。
CLR 本身并不阻止多重继承;因此,它在 C++.NET 中可用。
你不能在 Java 或 C# 中,因为这是语言中内置的设计决策。不管你同意与否,语言设计者认为实现的多重继承的困难,就像在 C++ 中所做的那样,不值得付出代价。
当我在 1995 年编写 C++ 时,它已经允许实现的多重继承。
早在 1995 年,Java 就做出了这个选择。出于同样的原因,C# 后来也效仿了。
我要指出的是,Java 和 C# 都允许您实现任意数量的接口。问题在于实现的多重继承。
我将把关于 C++ 如何消除实现的多重继承歧义的答案留给比我最近使用该语言的其他人。
使用虚拟继承解决了“死亡钻石”中的歧义。维基百科的文章是一个很好的解释。 虚拟继承
它也可以通过更好地设计你的类层次结构来解决。根据经验,只要您继承多个接口(在 C++ 中,纯抽象类),多重继承就可以了。
C++ 支持多重继承。然而,几乎所有其他现代面向对象语言,包括 Java,都选择不允许多重继承。(一些高级语言,例如 Eiffel,试图解决多重继承的问题)
多重继承的最大问题是,当编译器需要找到虚方法的正确实现时,它会产生歧义。
因此,为了简单起见,Java 和 C# 的创建者决定不允许多重继承。但是,还有一种替代多重继承的方法,称为接口
因此,将所有这些问题牢记在心,设计人员不允许语言中的多重继承,但语言仍然以接口等其他方式支持它。除了上述答案和链接之外,您还可以查看为什么 c# 不支持多重继承