c ++中的虚拟与非虚拟多重继承

时间:2012-04-14 16:24:11

标签: c++ multiple-inheritance virtual-inheritance

我当前正试图掌握c ++中多个虚拟/非虚拟继承的概念。如果我理解正确B类和C类是从A类继承的,它们共享一种单例对象,即它们都访问一个公共对象的相同字段A.多重继承会为任何B和C对象创建单独的A对象。 / p>

考虑到上述情况,是否有人会如此善良并将其呈现在一个简单实用的环境中?为什么首先要进行多重继承,然后再进行虚拟/非虚拟?

感谢。

1 个答案:

答案 0 :(得分:4)

多重继承通常不是used in C++。在大多数情况下,它是接口/实现的混合体。这也不是禁止的。对(虚拟)多重继承的需求来自于从一个通用基类派生的设计决策:

class Window 
{ /* draw, show, hide, background ... */ };

class WindowWithBorder : public virtual Window 
{ /* methods to manipulate / draw border ... */ };

class WindowWithMenu : public virtual Window
{ /* methods to manipulate / draw Menu ... */ };

class MyWindow : public WindowWithBorder, public WindowWithMenu
{ /* now it's your turn ... */ };

图书馆实施者必须预见那些菱形的继承图。 如果没有virtual,则会有两个基本Window个对象,virtual只有一个,但不是单个,因为可能有很多窗口。

图书馆通常可以(但不是在每种情况下)avoid这种情况,例如通过实现composite design pattern,具有“胖”基类,实现抽象接口类,或使用具有特征/策略的模板。

我建议阅读Bjarne Stroustrup The C++ Programming language中关于类层次结构的章节(我的第3版中的第15章,我借用了这个例子)。