使用受保护的c ++防止派生类的继承

时间:2017-10-15 08:16:29

标签: c++ inheritance

class A
{
    //friend class B;
    protected:
    A(){cout << "A\n";};

};
class B:  virtual A
{};

class C :  B
{};

int main() {
 C c;
 return 0;
}

我能够成功编译此代码,但由于A:A()受到保护,我期待错误。 基于以下事实:对于虚拟基类,其最派生类直接将其称为基类。 上面的代码给出了在基类中私有访问ctor()的编译错误[expected]。 有人可以澄清一下,谢谢!

1 个答案:

答案 0 :(得分:3)

拥有protected访问说明符意味着派生类可以访问该实体。 C也来自A,它不必直接从中派生,以便有资格获得受保护的访问权。

另一方面,private访问权限会阻止任何派生类具有B C的可访问性。

无法以一种只允许直接派生的类来访问构造函数(特别是一组直接派生类)的方式来控制访问。您可以做的最多的事情是使用private访问权限和friend附带一组封闭的派生类。

解决您对问题的评论:

  

我想禁止从B

继承

B标记为最终

class B final : A
{};