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
相关产品推荐
相关产品推荐

