【问题标题】:Diamond problem with interfaces接口的钻石问题
【发布时间】:2011-01-14 08:21:23
【问题描述】:

我正在使用许多只定义纯虚函数和一个虚拟(非纯)析构函数的抽象类。

不使用虚拟继承的菱形继承结构还可以吗? (我想确保即使某些程序员不知道他应该使用虚拟继承也不会出现问题。)有什么好的资源可以简短而完整地概述这个主题?

谢谢!

【问题讨论】:

    标签: c++ multiple-inheritance diamond-problem


    【解决方案1】:

    你不能。如果没有虚拟继承,继承图就不是菱形。如果Derived 继承自LeftRight,并且都从Base 非虚拟派生,那么每个Base 对象将有两个Base 子对象。

    【讨论】:

    • 如果 Base 只有纯虚方法呢?
    • 你仍然有两个副本。这意味着您可以通过转换Derived* 获得两个不同的Base* 值。并考虑一个常见的 vtable 实现:Base 两个 suobject 都有自己的 vptr。
    【解决方案2】:

    虚拟继承是您获得钻石的机制 - 如果您不使用虚拟继承,那么您将获得公共基类的两个不同副本 - 这不再是真正的钻石,可能也不是您想要的。

    【讨论】:

      【解决方案3】:

      This faq 通过示例为多重继承提供了很好的答案。

      对于钻石,你必须有虚拟继承。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多