虚拟继承可以说是默认的。如果我写类似:
class Base
{
public:
virtual ~Base() {}
virtual void f() = 0;
virtual int g() const = 0;
// ...
};
,很明显这个类是要继承自的。如果我以后写:
class Middle : public virtual Base
{
public:
virtual void f();
};
,该类仍然显然是一个基类——它只实现了部分接口。在这种情况下,继承
应该是虚拟的,因为我不知道(或不想只强加一个解决方案) 的实现g()
是在进一步的派生类中还是在姐妹类中(mixin-technology) . 因此,
class Derived1 : public Middle
{
public:
virtual int g() const;
};
没有钻石,但作者Middle
不知道会是这样,也不想禁止:
class M2 : public virtual Base
{
public:
virtual int g() const;
};
class Derived2 : public Middle, public M2
{
};
并且给定这样的层次结构,谁应该调用Base
's 的构造函数。唯一合理的候选人是Derived2
。