Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;克服钻石问题? 我不是C++的人,但我不得不考虑这个问题。为什么C++中不能继承多重继承呢?(我知道钻石的问题,但这不是我要问的)。C++如何区分继承多个基类的相同方法签名的模糊性?为什么同样的设计不能被纳入C#?_C#_C++_Multiple Inheritance - Fatal编程技术网

C++;克服钻石问题? 我不是C++的人,但我不得不考虑这个问题。为什么C++中不能继承多重继承呢?(我知道钻石的问题,但这不是我要问的)。C++如何区分继承多个基类的相同方法签名的模糊性?为什么同样的设计不能被纳入C#?

C++;克服钻石问题? 我不是C++的人,但我不得不考虑这个问题。为什么C++中不能继承多重继承呢?(我知道钻石的问题,但这不是我要问的)。C++如何区分继承多个基类的相同方法签名的模糊性?为什么同样的设计不能被纳入C#?,c#,c++,multiple-inheritance,C#,C++,Multiple Inheritance,这是一个选择的问题。C语言设计师Anders Hejlsberg选择将多重继承排除在语言之外。你可能想知道为什么。。。我的猜测是:(1)通常不需要多重继承,(2)多重继承经常以错误的方式使用(就像许多面向对象的构造一样),以及(3)它会使语言和/或编译器和/或静态检查变得不必要的复杂 CLR本身不阻止多重继承;因此,它可以在C++ .NET中使用。 在java或c*中不能使用,因为它是一种内置于语言的设计决策。不管你同意与否,语言设计者都认为,在C++中完成的多重继承困难是不值得的。 当我在19

这是一个选择的问题。C语言设计师Anders Hejlsberg选择将多重继承排除在语言之外。你可能想知道为什么。。。我的猜测是:(1)通常不需要多重继承,(2)多重继承经常以错误的方式使用(就像许多面向对象的构造一样),以及(3)它会使语言和/或编译器和/或静态检查变得不必要的复杂

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

在java或c*中不能使用,因为它是一种内置于语言的设计决策。不管你同意与否,语言设计者都认为,在C++中完成的多重继承困难是不值得的。 当我在1995年编写C++时,它已经允许实现的多重继承

Java早在1995年就做出了这一选择。C#后来也出于同样的原因效仿

我要指出,Java和C都允许您实现任意多的接口。问题在于实现的多重继承

< >我将回答C++如何将实现的多重继承明确化为比我最近使用语言的人的更多继承。

使用“虚拟继承”解决“死亡钻石”中的歧义。维基百科的文章是一个很好的解释。

通过更好地设计类层次结构,也可以潜在地解决这个问题。作为经验法则,只要继承多个接口(C++、纯抽象类),多重继承就可以了。

<> > C++中支持多重继承。然而,几乎所有其他现代面向对象语言,包括Java,都选择不允许多重继承。(一些高级语言,如埃菲尔,试图解决多重继承的难题)

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

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

所以,牢记所有这些问题,设计人员不允许语言中的多重继承,但语言仍以其他方式支持它,如接口。
除了上面的答案和链接,您还可以查看

它可以合并到C#中;它被排除在它带来的问题(混乱,模糊,……)中,C++是可能的,因为Bjarne把它放在了规范中。C语言中不可能,因为它的设计者没有把它放在他们的规格中(故意)。如果C++中需要消歧,那么,通常使用范围解析算子<代码>:: C++。“通过给程序员工具来解决歧义,这是区分的”(虚拟基类,<代码>::/COD>操作符,例如)。但它们通常使用起来很麻烦;这就是为什么许多其他语言通过在类之间使用单一继承来避免这个问题(在C#中,您仍然有多个接口实现)@QuestionCloser:您为什么试图关闭这个问题?我问的有什么不对吗?这类问题可能会引起争论,不适合StackOverflow的技术问答形式。因此,它可能会被关闭。但是,这是程序员的正确主题。StackExchange.com-你应该在那里问一下。我正要发布同一个wiki链接。缓解部分漂亮地解释了多重继承如何在不同语言中得到支持。请随时给我投票。;-)这并没有真正回答作者的问题。有比你更好的答案,我不明白。“大多数时候,我使用多重继承来进行组合,因此继承纯抽象类是毫无意义的。”Ramhound。“C++如何克服钻石问题?”“C++如何区分继承同多个基类的相同方法签名的模糊性?”你的阅读理解能力严重不足。