C++ 中的密封 类 和虚拟继承
Sealing classes in C++ and virtual inheritance
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// This class is capable of being instantiated
};
上面的封class失败了,但是下面的封了,为什么?
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public virtual ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// Cannot be instantiated
};
这里发生了什么?虚继承在这里起到什么作用?
对于正常的继承,派生的class的构造函数只调用直接基础class的构造函数。因此在第一个示例中,FailsToDerive
的构造函数调用 Sealed
的构造函数,后者又调用 ClassSealer
的构造函数,这是允许的。
然而,虚拟 继承基的构造函数被最派生的class 的构造函数调用。所以在第二个例子中,FailsToDerive
的构造函数需要能够调用 ClassSealer
的构造函数,这是不允许的,因为它不是 ClassSealer
的朋友。
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// This class is capable of being instantiated
};
上面的封class失败了,但是下面的封了,为什么?
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public virtual ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// Cannot be instantiated
};
这里发生了什么?虚继承在这里起到什么作用?
对于正常的继承,派生的class的构造函数只调用直接基础class的构造函数。因此在第一个示例中,FailsToDerive
的构造函数调用 Sealed
的构造函数,后者又调用 ClassSealer
的构造函数,这是允许的。
然而,虚拟 继承基的构造函数被最派生的class 的构造函数调用。所以在第二个例子中,FailsToDerive
的构造函数需要能够调用 ClassSealer
的构造函数,这是不允许的,因为它不是 ClassSealer
的朋友。