公有继承下为何无法访问基类的protected成员函数?
为什么公有继承后无法通过子类对象调用基类的protected成员?
这是C++中protected成员访问规则的必然结果,和继承方式无关。
核心规则
基类的protected成员有明确的访问限制:
- 仅允许基类自身的成员函数、友元访问;
- 仅允许派生类的成员函数、友元访问;
- 绝对不允许外部代码通过派生类的对象直接调用——哪怕是公有继承。
结合你的代码分析
你代码里的Base::Method是protected修饰的,虽然SubA以public方式继承Base,但这只意味着SubA内部可以访问Method,而main函数属于类外部代码,通过sa.Method()直接调用的行为违反了protected的访问规则,所以编译器会提示“函数不可访问”。
正确的调用方式
如果需要在外部调用基类的protected成员,必须通过派生类的成员函数作为“桥梁”:
#include <iostream> #include <string> class Base { public: virtual void b() {} protected: std::string Method() { return "Base::Method"; } }; class SubA : public Base { public: int doSomething() { return 7; } // 派生类成员函数可以合法访问基类protected成员 std::string getBaseMethodResult() { return Method(); } }; int main() { SubA sa; sa.doSomething(); // 通过派生类成员函数间接调用 std::cout << sa.getBaseMethodResult() << std::endl; }
补充说明
公有继承的作用是保留基类成员在派生类中的访问级别:基类的public成员在SubA中还是public,protected成员还是protected——但这不会改变protected成员本身的访问范围,外部代码始终无权直接访问。
内容的提问来源于stack exchange,提问作者TMOTTM
相关产品推荐
相关产品推荐

