【问题标题】:When is virtual inheritance a good idea?什么时候虚拟继承是个好主意?
【发布时间】:2011-04-18 14:49:42
【问题描述】:

我正在制作一个游戏 GUI API,其中每个小部件都继承自 Widget 类。我在想,当其他人在那里制作自己的小部件时,他们可能对基类并不完全满意。例如,他们可能想要添加 getTheme()。让我的所有小部件虚拟地从 Widget 继承是个好主意吗?

谢谢

【问题讨论】:

  • “虚拟继承”是什么意思?
  • @Mat 我很清楚虚拟基类。但是,C++ 没有虚拟继承的概念,或者即使有,也没有在 C++ 标准中提及。
  • @unapersson:是的。查看第 10 节“派生类”(我在 C++0x 的 n3092 草案中有,但以前就已经存在)
  • @Mat Nope,刚刚浏览了整个部分 - 没有使用“虚拟继承”一词。

标签: c++


【解决方案1】:

仅仅因为用户将自己的方法添加到子类中并不意味着您需要使用虚拟继承。如果在您的库中,您有一个带有多个子类的基类,并且人们可以一次从多个子类继承(例如混合而不是替换),您将使用它。

【讨论】:

    【解决方案2】:

    解决菱形继承问题。 (B 和 C 都继承自 A。A 在 D 中继承自 B 和 C 的属性会怎样?)

    您图书馆的客户可以看到 RedWidget 和 FlyingWidget,并且可能希望将它们组合成 RedFlyingWidget。

    用户在继承时必须指定其中一个基类是虚拟的。但这不是图书馆制造商的责任。

    单实现继承的 OOP 流动性更好,所以我会在整个库中使用它。

    还有“倒置继承”树,正如 Alexandrescu 出色的“Modern C++ Design”所描述的。它们允许客户端以称为策略的混合形式引入更多功能。

    使用策略进行编程可以提高组合功能的能力,但会牺牲语法的简洁性。以 STL 实现为例。

    【讨论】:

    • 应该关注的不是方法,而是数据。如果A是纯接口,则没有问题。
    • 解决就是什么。问题是这是否是个好主意。
    • @Milo:这是一个相关的讨论:stackoverflow.com/questions/4605556/…
    【解决方案3】:

    什么时候虚拟继承是个好主意?

    这是一个设计问题。

    对于您的小部件,我会说是的,多派生类应该可以选择只有 1 个小部件。

    【讨论】:

      【解决方案4】:

      只要您的库的用户有可能使用您库中的几个类作为基类(即从它们派生),您就必须使用虚拟继承。换句话说,在你的情况下使用它是个好主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2011-08-20
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多