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
};

这是怎么回事虚拟继承在这里起什么作用?

最佳答案

对于常规继承,派生类的构造函数仅调用直接基类的构造函数。因此,在第一个示例中,FailsToDerive的构造函数调用Sealed的构造函数,后者又调用ClassSealer的构造函数,这是允许的。

但是,几乎继承的基类的构造函数由最派生类的构造函数调用。因此,在第二个示例中,FailsToDerive的构造函数需要能够调用ClassSealer的构造函数,由于它不是ClassSealer的 friend ,因此不允许这样做。

07-26 03:48