【问题标题】:virtual vs non-virtual multiple inheritance in c++C ++中的虚拟与非虚拟多重继承
【发布时间】:2012-04-14 16:24:11
【问题描述】:

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

考虑到上述情况,有人会如此友善并在简单实用的环境中介绍它吗?为什么首先要进行多重继承,然后为什么要使用虚拟/非虚拟?

谢谢。

【问题讨论】:

  • 您读过哪些有关 C++ 编程的文章?多重继承或虚拟继承很棘手,应该经常避免。问题在于从 B 和 C 继承的 D 类。
  • 嗯,我现在正在研究它,我只有基本的介绍。如果有人能举一个简单的例子说明你为什么要使用其中一个,我肯定会更好。我不需要任何复杂/边缘案例。简单的,典型的场景,一句话就完美了。
  • 我很少需要使用多重继承或虚拟继承。一个好的规则是永远不要使用它。
  • @BasileStarynkevitch "一个好的规则是永远不要使用它。" 不,一个好的规则是在适当的时候使用它。

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


【解决方案1】:

多重继承并不常见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 章,我借用了这个例子)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2010-09-22
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2014-11-06
    相关资源
    最近更新 更多