如果我声明一个派生类,其中还包含一个基类型的附加成员,则会出现"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。
答案 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
关键字。