为何使用保护/私有继承时派生类实例无法访问基类保护成员?
问题拆解与解答
咱们先理清楚你困惑的核心:你对protected继承的权限规则和派生类成员的访问范围存在误解,导致代码里出现了编译错误。
核心错误原因分析
先看你的代码里的继承声明:
class Derived: protected Base{ ... };
当你用protected继承基类时,基类中的public和protected成员都会被降级为派生类的protected成员——这意味着这些成员只能在Derived的内部(成员函数、友元)以及Derived的派生类中访问,外部作用域(比如main函数)是无权直接调用的。
针对两个编译错误的具体解释
derived->g()编译失败
Base类的g()原本是public成员,但因为Derived是protected继承Base,所以g()在Derived类中的访问权限变成了protected。而main函数属于外部作用域,不能直接访问类的protected成员,因此编译报错。derived->h()编译失败
这个更直接:你在Derived类里把h()声明成了private成员,根据C++的权限规则,外部作用域完全无法访问类的private成员,和继承关系无关。
纠正你之前的误解
你之前以为“基类的protected成员可以被派生类的实例访问”,这是错的——正确的规则是:
- 基类的protected成员,允许派生类的成员函数/友元在内部访问(比如Derived的成员函数里可以调用Base的protected成员);
- 但派生类的实例在外部作用域(比如main),不能直接访问任何继承来的protected/private成员,不管基类的原权限是什么。
另外补充继承方式对成员权限的影响:
- public继承:基类public→派生类public,基类protected→派生类protected(最常用的继承方式,保持基类的权限等级)
- protected继承:基类public/protected→派生类protected(把基类的对外接口隐藏,只给派生类自己和它的子类用)
- private继承:基类public/protected→派生类private(完全隐藏基类的成员,只有当前派生类内部能访问)
验证修改:把继承改成public
如果把Derived的继承方式改成public:
class Derived: public Base{ ... };
此时Base的public成员g()在Derived中还是public,main里的derived->g()就能正常编译运行了,而derived->h()依然会报错(因为它是Derived的private成员)。
内容的提问来源于stack exchange,提问作者AnonBNR
相关产品推荐
相关产品推荐

