c++ - C++ 中的密封类和虚拟继承

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

这里发生了什么?虚拟继承在这里扮演什么角色?

最佳答案

对于正常的继承,派生类的构造函数只调用直接基类的构造函数。所以在第一个例子中,FailsToDerive 的构造函数调用 Sealed 的构造函数,它又调用 ClassSealer 的构造函数,这是允许的。

然而,虚拟 继承基类的构造函数由最派生类 的构造函数调用。所以在第二个例子中,FailsToDerive的构造函数需要能够调用 ClassSealer的构造函数,不允许这样做,因为它不是 ClassSealer 的友元.

关于c++ - C++ 中的密封类和虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33841954/

相关文章:

c# - EF4 和多个抽象级别

oop - 子类和继承类之间有什么技术区别吗?

access-control - 如何将 APDU 发送到 Mifare Classic 1k 卡?

java - 具体化继承类中的数据类型

swift - 如何使 Swift 框架子模块真正私有(private)?

javascript - Reactjs 无法读取智能合约?

c++ - 编译的 C++ 程序充满了 mojibake?

c++ - include_directories 和 CMAKE_INSTALL_FULL_INCLUDEDIR

c++ - 在 vector 中搜索对象的任何实例时出错

C++ 包含,使用 cplusplus {{ }} 构造