多个虚拟(钻石)继承

时间:2017-07-12 19:45:41

标签: c++ multiple-inheritance

我在" C ++的设计和演变中找到了以下代码"通过Stroustrup:

class W
{
public:
  virtual void f();
  virtual void g();
};

class AW : public virtual W
{
public:
  void g() {}
};

class BW : public virtual W
{
public:
  void f() {}
};

class CW: public AW, public BW ***, public virtual W***
{

};

CW* pcw = new CW;
AW* paw = pcw;
BW* pbw = pcw;

void fff()
{
  pcw->f(); //invokes BW:f()
  pcw->g(); //invokes AW:g()
  paw->f(); //invokes BW:f() !
  pbw->g(); //invokes AW:g() !
}

它举例说明了mixin行为即。不同的类将行为添加到一个共同的基础,并且彼此了解彼此"。

为什么CW直接从W继承( ,公共虚拟W )? 我在VC2015中尝试使用和不使用它,它会生成相同的类布局。

1 个答案:

答案 0 :(得分:1)

来自Stroustrup的 C ++编程语言(第四版)(21.3.5,第632页):

  

对象[CW]的所有部分必须共享[W]的单个副本。否则,我们可以多次得到[W]派生的两部分...我们通过声明一个基类virtual来避免复制:派生类的每个virtual基都由相同的表示(共享) )对象。

  

我在VC2015中尝试过和不使用它,它会生成相同的类布局。

在这种情况下它不那么重要的原因是因为W没有要复制的实例变量;无论如何,W中的所有方法都被声明为virtual