0

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

考虑到上述情况,会有人如此友善并在一个简单实用的背景下呈现它吗?为什么首先要进行多重继承,然后为什么要使用虚拟/非虚拟?

谢谢。

4

1 回答 1

4

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只有一个,但不是单例,因为可以有很多窗口。

库通常可以(但不是在所有情况下)避免这种情况,例如通过实现复合设计模式、拥有“胖”基类、实现抽象接口类或使用带有特征/策略的模板。

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

于 2012-04-14T18:49:24.840 回答