我一直在阅读有关多重继承的信息
What is the exact problem with multiple inheritance? http://en.wikipedia.org/wiki/Diamond_problem
http://en.wikipedia.org/wiki/Virtual_inheritance
http://en.wikipedia.org/wiki/Multiple_inheritance
但是由于代码在解决歧义之前不能编译,这不会使多重继承成为编译器编写者的问题吗? - 如果我不想编写编译器
,这个问题如何影响我答案 0 :(得分:4)
如果您想编写编译的代码,您必须知道哪些问题可能导致它无法编译以及如何避免这些情况。作为编译器的用户,您可以以可编译的方式设计继承层次结构。
此外,如果您不理解多重继承是如何工作的,那么您可能错误地假设您的类的确切行为。如果类的行为与预期不同,则在尝试使用它们时会导致错误。
答案 1 :(得分:1)
如果由于多重继承而导致未解决的歧义,编译器编写器将打印一个讨厌的错误消息并停止编译代码。当他们说代码在解决歧义之前不会编译时,有几个问题需要考虑:
答案 2 :(得分:1)
不,它对编译器编写器来说不是问题:
对于C ++程序员来说这是一个问题,但前提是你不了解MI在C ++中是如何工作的。
我有一个通用的解决方案,它有一个定义公共接口的基类 - 你可以认为它有不同的子部分,然后你可以将它们实现为不同的抽象类,它们由一个具体的叶子类多次继承:
------
| Base |
------
| |
------
^
|
-----------------
| | |
------ ------ ------
| A | | B | | C |
------ ------ ------
| | | | | |
------ ------ ------
^ ^ ^
| | |
-----------------
|
-------
|Derived|
-------
| |
-------
A,B和C中的每一个都实现了Base的非重叠子部分,这意味着您可以替换A,代替A,用于替代或改进的实现,而不会影响任何其他类。
答案 3 :(得分:0)
总的来说,是的,你在头上钉了一针。它显着增加了维护编译器所涉及的复杂性和工作量,但对于程序员来说,它只增加了少量额外的复杂性,主要与如果钻石问题出现时必须冗长具体相关。 (在精心设计的对象层次结构中,这应该是非常罕见的。)