多继承是编译器编写者的问题吗? - c ++

时间:2010-03-27 09:44:30

标签: c++ inheritance multiple-inheritance

我一直在阅读有关多重继承的信息

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

但是由于代码在解决歧义之前不能编译,这不会使多重继承成为编译器编写者的问题吗? - 如果我不想编写编译器

,这个问题如何影响我

4 个答案:

答案 0 :(得分:4)

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

此外,如果您不理解多重继承是如何工作的,那么您可能错误地假设您的类的确切行为。如果类的行为与预期不同,则在尝试使用它们时会导致错误。

答案 1 :(得分:1)

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

  1. 在解决歧义之前,您没有工作程序。
  2. 编译器无法为您解决此问题。
  3. 因此,在您解决之前,这是您的问题,而不是编译器编写者。

答案 2 :(得分:1)

不,它对编译器编写器来说不是问题:

  • 通常,编译器编写器可能正在定义多继承的工作方式。
  • 特别是对于C ++,有几种解决方案供作者实现。

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

我有一个通用的解决方案,它有一个定义公共接口的基类 - 你可以认为它有不同的子部分,然后你可以将它们实现为不同的抽象类,它们由一个具体的叶子类多次继承:

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

A,B和C中的每一个都实现了Base的非重叠子部分,这意味着您可以替换A,代替A,用于替代或改进的实现,而不会影响任何其他类。

答案 3 :(得分:0)

总的来说,是的,你在头上钉了一针。它显着增加了维护编译器所涉及的复杂性和工作量,但对于程序员来说,它只增加了少量额外的复杂性,主要与如果钻石问题出现时必须冗长具体相关。 (在精心设计的对象层次结构中,这应该是非常罕见的。)