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

C++ 什么时候虚拟继承是个好主意?,c++,C++,我正在制作一个游戏GUI API,其中每个小部件都继承自小部件类。我在想,当其他人在那里制作自己的小部件时,他们可能对基类并不完全满意。例如,他们可能想要添加getTheme()。让我所有的小部件实际上都从小部件继承是一个好主意吗 感谢您解决菱形继承问题。(B和C都从A继承。A在D中的属性本身从B和C继承时会发生什么情况?) 您库的客户端可以看到RedWidget和FlyingWidget,并且可能希望将它们组合成RedFlyingWidget 用户在继承时必须指定一个要为虚拟的基类。但这不是图

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


感谢您解决菱形继承问题。(B和C都从A继承。A在D中的属性本身从B和C继承时会发生什么情况?)

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

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

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

还有“倒置继承”树,正如Alexandrescu的优秀著作所描述的那样,“它们允许客户端以称为策略的混合形式引入更多功能


使用策略编程允许更大的能力来组合功能,而牺牲了语法的整洁性。以STL实现为例。

每当库的用户有可能使用库中的几个类作为基类(即从它们派生)时,就必须使用虚拟继承。换句话说,在您的案例中使用它是一个好主意

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

这是一个设计问题


对于您的小部件,我会说是的,多个派生类应该有一个选项,即只作为一个小部件

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

您所说的“虚拟继承”是什么意思?@unaperson:@Mat我非常了解虚拟基类。但是,C++没有虚拟继承的概念,或者如果它没有在C++标准中提到它。看看第10节“派生类”(我在C++0x的草案n3092中有这个,但它以前就已经存在过了)@Mat Nope,刚刚看完了整个部分-没有使用“虚拟继承”这个术语。你应该关心的不是方法,而是数据。如果
A
是一个纯接口,那么就不存在问题。解决问题就是解决问题。问题是这是否是个好主意。@Milo:这里有一个相关的讨论: