其他分享
首页 > 其他分享> > 密封C语言中的类和虚拟继承

密封C语言中的类和虚拟继承

作者:互联网

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的朋友所以不允许这样做.

标签:access-control,virtual-inheritance,c,inheritance,sealed
来源: https://codeday.me/bug/20190824/1707293.html