是多重继承一个编译器编写者的问题? - C++

问题描述:

我一直在阅读有关多重继承是多重继承一个编译器编写者的问题? - C++

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

但由于代码不编译,直到不确定性得到解决,没有这个做多重继承编译器编写者只有一个问题? - 这个问题如何影响我的情况下,我不想编码编译器

如果你想编写代码编译,你必须知道什么样的问题可能导致其无法编译,以及如何避免这些情况。作为编译器的用户,您的问题是要以可编译的方式设计继承层次结构。

此外,如果你不明白多重继承是如何工作的,你可能会错误地假设你的类是做什么的。如果类的行为与预期不同,那么当您尝试使用它们时会导致错误。

一般来说,是的,你击中了头部的指甲。它显著增加参与维持编译器的复杂性和精力,但对于程序员,它只是增加了少量的额外的复杂性,主要涉及不必是如果钻石出现问题繁琐具体。 (这应该是一个精心设计的对象层次非常罕见的。)

如果由于多重继承而导致未解决的歧义,编译器编写器将打印一个令人讨厌的错误消息并停止编译您的代码。当他们说代码在歧义解决之前不能编译时,有几个问题需要考虑:

  1. 直到解决了歧义之后,您才有工作程序。
  2. 编译器无法为您解决它。
  3. 因此,直到你解决它,这是你的问题,不是编译器作者的。

不,它不是一个编译器作者一个问题:

  • 一般编译器作者可能会被定义继承如何的多部作品。
  • 具体地为C++,存在用于写入器实现了几种解决方案。

这对C++程序员来说是一个问题,但前提是你不了解MI在C++中的工作方式。

我有一个通用的解决方案,它有一个基类,它定义了一个公共接口 - 然后您认为它具有不同的子节点,然后将其实现为不同的抽象类,它们被具体的叶类继承:

  ------ 
     | Base | 
     ------ 
     |  | 
     ------ 
     ^
      | 
    ----------------- 
    |  |  | 
------ ------ ------ 
| A | | B | | C | 
------ ------ ------ 
|  | |  | |  | 
------ ------ ------ 
    ^ ^ ^
    |  |  | 
    ----------------- 
      | 
      ------- 
     |Derived| 
      ------- 
     |  | 
      ------- 

每个A,B和C的执行基地非重叠子部分,这意味着可以换出,说A,为A”用于替代或改进的实施,而不会影响任何其他类。