【问题标题】:Sealing classes in C++ and virtual inheritanceC++ 中的密封类和虚拟继承
【发布时间】:2016-02-23 20:12:53
【问题描述】:
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
};

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

【问题讨论】:

  • 这种技术已经过时了。请改用新关键字final
  • @RichardHodges 谢谢。但我想知道上述特殊行为背后的原因。

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


【解决方案1】:

对于普通继承,派生类的构造函数只调用direct基类的构造函数。所以在第一个例子中,FailsToDerive的构造函数调用了Sealed的构造函数,而Sealed的构造函数又调用了ClassSealer的构造函数,这是允许的。

实际上继承的基类的构造函数被最派生类的构造函数调用。所以在第二个例子中,FailsToDerive的构造函数需要能够调用ClassSealer的构造函数,这是不允许的,因为它不是ClassSealer的朋友。

【讨论】:

  • 能否请您告诉在哪里阅读有关构造函数调用约定的信息。谢谢!
  • 用“non-virtual”替换“normal”,除非你想显得non-virtual-normative?
  • @KerrekSB 我认为非虚拟是正常的,因为如果你不添加任何额外的关键字,就会得到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多