我在" 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中尝试使用和不使用它,它会生成相同的类布局。
答案 0 :(得分:1)
来自Stroustrup的 C ++编程语言(第四版)(21.3.5,第632页):
对象[CW]的所有部分必须共享[W]的单个副本。否则,我们可以多次得到[W]派生的两部分...我们通过声明一个基类
virtual
来避免复制:派生类的每个virtual
基都由相同的表示(共享) )对象。
我在VC2015中尝试过和不使用它,它会生成相同的类布局。
在这种情况下它不那么重要的原因是因为W
没有要复制的实例变量;无论如何,W
中的所有方法都被声明为virtual
。