公有继承中,基类私有成员经派生类公开指针能否在main中直接访问?
问题解答:公有继承下能否通过派生类指针直接访问基类private成员
一、原代码的编译错误
你给出的代码存在语法错误:在Shape类的定义中,直接对成员指针a、b进行赋值操作a = &width;是不允许的——类定义中只能声明成员,不能直接执行赋值语句,这类初始化操作必须放在构造函数或者成员函数中完成。
二、修正后的代码示例
#include <iostream> using namespace std; class Shape { private: int width; int height; public: int* a, * b; // 将指针初始化放到构造函数中 Shape() { a = &width; b = &height; } }; class Rectangle : public Shape { public: void setWidth(int w) { *a = w; } void setHeight(int h) { *b = h; } int getArea() { return (*a * *b); } }; int main() { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); cout << "Total area: " << Rect.getArea() << endl; // 以下代码会触发编译错误,无法通过 // *Rect.a = 10; // *Rect.b = 20; return 0; }
三、核心问题解答
1. 派生类成员函数可以通过指针访问基类private成员
修正后的代码中,Rectangle的成员函数setWidth、setHeight可以通过基类的public指针a、b修改基类的private成员width、height。这是因为:
- 派生类继承了基类的public成员指针
a、b,有权限访问这些指针; - C++的访问权限控制是针对成员名字的,而非内存地址。在派生类成员函数的上下文中,通过指针解引用访问内存时,编译器不会阻止这种操作(只要指针本身是可访问的)。
2. main函数中无法直接通过指针访问基类private成员
如果在main中尝试执行*Rect.a = 10;这类操作,编译器会直接报错,错误信息类似:'int Shape::width' is private within this context。
这是因为:
- C++的访问权限检查是编译期行为,编译器能够追踪到指针
a指向的是基类的private成员width; main函数不属于基类或派生类的成员/友元,没有权限访问基类的private成员,即使通过指针间接访问也会被编译器拦截。
总结
- 不能在
main函数中直接通过派生类的public指针访问并操作基类的private成员,编译器会通过访问权限检查阻止这种行为。 - 派生类的成员函数可以借助基类的public指针间接操作基类private成员,但这本质上是利用了访问权限控制的规则特性,并非推荐的编程方式(破坏了封装性)。
内容的提问来源于stack exchange,提问作者mustafa adnan
相关产品推荐
相关产品推荐

