You need to enable JavaScript to run this app. C++如何访问受保护运算符成员?派生类调用基类operator[]的方法
优惠活动
大模型
产品
解决方案
定价
更多

C++如何访问受保护运算符成员?派生类调用基类operator[]的方法

B类display函数调用基类protected版operator[]的实现方案

基本权限说明

C++公开继承的规则下,基类中标记为protected的成员,本来就是供派生类直接访问的,不存在权限拦截,不需要写额外的权限适配代码。

可直接落地方案

  • 先把原代码里的语法错误修正:所有写了大写首字母的Public访问修饰符,必须改成全小写的public——C++的访问修饰符是全小写关键字,大写写法会直接编译报错。
  • 在display函数内部,通过解引用当前对象拿到实例,直接调用继承来的operator[]就行,不需要绕路。

完整可运行的参考代码

#include <iostream>
class A {
    // 修正原代码的类型不规范问题:字符串字面量是const char*类型,赋值给非const char*在现代C++中是被废弃的写法
    const char* m = "ABCD";
protected:
    const char& operator[](int i) const { 
        return m[i]; 
    }
public:
    A() = default;
};

class B : public A { // 修正原代码中大写Public的语法错误
    char* D;
public:
    B() : A() {};
    void display() {
        // 遍历输出,实现类似[0]=A的效果
        for (int i = 0; i < 4; i++) {
            // 必须先解引用this:this[i]是指针偏移运算,不会触发类重载的operator[]
            std::cout << "[" << i << "]=" << (*this)[i] << '\n';
        }
    }
};

容易踩的坑

  • 别直接写this[i]:this是指向当前B类对象的指针,直接套方括号会被解析成指针地址偏移,完全不会调用类里重载的operator[],必须先写*this拿到对象本身再用方括号。
  • 如果之后给B类加了自己的operator[]实现,会直接把基类继承来的同名函数给遮蔽掉,这时候要访问基类的版本,需要显式指定作用域,比如A::operator[](i)。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 05:15:07