【问题标题】:is multiple inheritance a compiler writers problem? - c++多重继承是编译器作者的问题吗? - C++
【发布时间】:2010-03-27 09:44:30
【问题描述】:

我一直在阅读关于多重继承的文章

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

但是由于在歧义得到解决之前代码不会编译,这难道不会使多重继承成为编译器编写者的问题吗? - 如果我不想编写编译器,这个问题对我有什么影响

【问题讨论】:

    标签: c++ inheritance multiple-inheritance


    【解决方案1】:

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

    此外,如果您不了解多重继承的工作原理,您可能会对类的具体功能有错误的假设。如果类的行为与您预期的不同,则在您尝试使用它们时会导致错误。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        • 一般来说,编译器编写者可能会定义多重继承的工作原理。
        • 特别是对于 C++,有几种解决方案供作者实现。

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

        我有一个通用的解决方案,即拥有一个定义公共接口的基类 - 然后您将其视为具有不同的子部分,然后您将其实现为不同的抽象类,这些抽象类由一个具体的叶类多重继承:

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

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

        【讨论】:

          【解决方案4】:

          一般来说,是的,你一针见血。它显着增加了维护编译器所涉及的复杂性和工作量,但对于程序员来说,它只增加了少量额外的复杂性,主要与如果出现菱形问题必须进行繁琐的具体化有关。 (这在设计良好的对象层次结构中应该很少见。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-23
            • 2019-10-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多