You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

公有继承下为何无法访问基类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:35:23