2012-04-14 239 views
0

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

考虑到上述因素,是否有人会如此善良,并将其呈现在简单实用的环境中?为什么在多数继承首先,然后为什么虚拟/非虚拟?

谢谢。

+0

你读过关于C++编程的内容吗?多重或虚拟继承很棘手,经常应该避免。问题是从B和C继承D类。 – 2012-04-14 16:27:10

+0

现在我正在研究它,我只有基本的介绍。如果有人能够举一个简单的例子来说明你为什么要使用其中一个,那么我肯定会变得更好。我不需要任何复杂/临界的情况。基本的,典型的情景将是完美的,用一句话。 – Bober02 2012-04-14 16:33:40

+0

我很少必须使用多重继承或虚拟继承。一个好的规则是永远不要使用它。 – 2012-04-14 16:48:12

回答

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章,我借用了该示例)中的类层次结构一章。