用C ++和虚拟继承密封类

时间:2015-11-21 09:51:45

标签: c++ inheritance access-control virtual-inheritance sealed

class ClassSealer {
private:
   friend class Sealed;
   ClassSealer() {}
};
class Sealed : public ClassSealer
{ 
   // ...
};
class FailsToDerive : public Sealed
{
   // This class is capable of being instantiated
};

以上未能封印课程,但以下工作,为什么?

class ClassSealer {
private:
   friend class Sealed;
   ClassSealer() {}
};
class Sealed : public virtual ClassSealer
{ 
   // ...
};
class FailsToDerive : public Sealed
{
   // Cannot be instantiated
};

这里发生了什么?虚拟继承在这里发挥了什么作用?

1 个答案:

答案 0 :(得分:6)

对于正常继承,派生类的构造函数只调用 direct 基类的构造函数。因此,在第一个示例中,FailsToDerive的构造函数调用Sealed的构造函数,后者又调用ClassSealer的构造函数,允许它执行。

虚拟继承的基础的构造函数由大多数派生类的构造函数调用。所以在第二个例子中,FailsToDerive的构造函数需要能够调用ClassSealer的构造函数,由于它不是ClassSealer的朋友,所以不允许这样做。< / p>