我正在制作游戏GUI API,其中每个小部件都继承自Widget类。我在想,当其他人制作自己的小部件时,他们可能对基类不满意。例如,他们可能想要添加getTheme()。让我的所有小部件实际上都是从Widget中继承下来以便这可能是一个好主意吗?
由于
答案 0 :(得分:4)
解决菱形继承问题。 (B和C都从A继承。在D中A的属性发生了什么,它本身是从B和C继承的?)
您图书馆的客户可以看到RedWidget和FlyingWidget,并且可能希望将它们组合成RedFlyingWidget。
用户必须在继承时将其中一个基类指定为虚拟。但这不是图书馆制造商的责任。
OOP在单实现继承中流动得更好,这就是我在整个库中使用的内容。
还有“颠倒的遗产”树,正如亚历山大夫斯库的优秀“Modern C++ Design”所描述的那样。它们允许客户以称为策略的混合形式提供更多功能。
使用策略进行编程可以提高组合功能的能力,但会牺牲语法清洁度。例如,考虑STL实现。
答案 1 :(得分:4)
仅仅因为用户将自己的方法添加到子类并不意味着您需要使用虚拟继承。如果在您的库中有一个包含多个子节点的基类,并且人们可以一次从多个子类继承(例如mixin而不是替换),则可以使用它。
答案 2 :(得分:1)
什么时候虚拟继承是一个好主意?
这是一个设计问题。
对于你的Widgets,我会说是的,多派生类应该可以选择只有1个Widget。
答案 3 :(得分:0)
每当您的库的用户有可能使用库中的几个类作为基类(即从它们派生)时,您必须使用虚拟继承。换句话说,在你的情况下使用它是个好主意。