如果我声明一个派生类(它还包括一个基本类型的附加成员),则会得到一个"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的朋友,错误就会消失。有人能解释一下这里发生了什么吗?
蒂娅。
发布于 2015-07-07 04:18:25
问题是Derived2
包含Base
的一个实例。
受保护成员的可访问性仅在访问其继承的成员的派生类实例的上下文中。它不允许构造具有受保护构造函数的成员。
因此,Derived2
的构造函数不能构造other_base
,而是可以构造它继承的Base
。
将Derived2
声明为friend
of Base
允许构造other_base
。
发布于 2015-07-07 04:15:58
这是因为other_base
实际上不是Derived2
类的一部分,它是一个单独的对象,它遵循公共/受保护/私有成员的正常规则。
发布于 2015-07-07 04:47:04
在您的示例中,other_base被视为您的Derived2
类的成员,并且它遵循正常的访问规则。唯一可以调用受保护的Base()
ctor的地方是Derived2
ctor的initzialization列表:
Derived2():Base() {}
如果要使用受保护/私有方法/成员,请使用friend
关键字。
https://stackoverflow.com/questions/31268243
复制相似问题