我在Stroustrup的"The Design and Evolution of C++"中找到了以下代码:
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() !
}
它举例说明了混合行为,即不同的类将行为添加到一个共同的基础中,并且"相互了解"。
为什么 CW 直接从 W 继承(,公共虚拟 W(? 我在VC2015中尝试了有和没有,它生成了相同的类布局。
摘自Stroustrup的The C++ Programming Language(第四版((21.3.5,第632页(:
对象 [CW] 的所有部分必须共享 [W] 的单个副本。否则,我们可以多次获得从 [W] 派生的事物的两个部分......我们通过声明基
virtual
来避免复制:派生类的每个virtual
基都由相同的(共享(对象表示。
我在VC2015中尝试了有和没有,它生成了相同的类布局。
在这种情况下它不太重要的原因是W
没有要复制的实例变量;无论如何,W
中的所有方法都声明virtual
。