C ++受保护的ctor对派生类

时间:2015-07-07 12:11:43

标签: c++ inheritance

如果我声明一个派生类,其中还包含一个基类型的附加成员,则会出现"constructor is protected"错误。

TEST.CPP:

class Base { protected: Base() {} };

class Derived1 : public Base
  {
    Derived1()  {}
  };

class Derived2 : public Base
  {
    Derived2()  {}
    Base    other_base;
  };

$ g ++ test.cpp

test.cpp: In constructor ‘Derived2::Derived2()’:
test.cpp:3:25: error: ‘Base::Base()’ is protected
 class Base { protected: Base() {} };
                         ^
test.cpp:12:14: error: within this context
  Derived2()  {}

如果我宣布Derived2为Base的朋友,那么错误就会消失。谁能解释一下这里发生了什么?

TIA。

3 个答案:

答案 0 :(得分:7)

这是因为other_base实际上不是Derived2类的一部分,它是一个单独的对象,遵循公共/受保护/私有成员的正常规则。

答案 1 :(得分:3)

问题是.main-content包含Derived2的实例。

受保护成员的可访问性仅在派生类实例访问其继承的成员的上下文中。它不允许构建具有受保护构造函数的成员。

因此,Base的构造函数无法构造Derived2,但可以构造它继承的other_base

Base声明为Derived2 friend可以构建Base

答案 2 :(得分:1)

在您的示例中,other_base被视为Derived2类的成员,它遵循正常的访问规则。您可以致电受保护Base() ctor的唯一地方是Derived2 ctor的初始化列表:

  

Derived2():Base(){}

如果您想使用受保护/私有方法/成员使用friend关键字。