我在 C++ 中有一个场景,我通过基类指针访问派生类的私有成员,并且它似乎可以正常工作,没有任何错误。这是代码的简化版本:
#include <iostream>
using namespace std;
class Shape {
public:
virtual void calculateArea() {
cout << "Parent CLASS ";
}
};
class Rectangle : public Shape {
private:
void calculateArea() override {
cout << "Child class";
}
};
int main() {
int arraySize = 2;
Shape *shapes[arraySize]; // Array of Shape pointers
shapes[0] = new Shape;
shapes[1] = new Rectangle;
shapes[1]->calculateArea();
// Cleanup: Delete dynamically allocated objects
for (int i = 0; i < arraySize; ++i) {
delete shapes[i];
}
return 0;
}
我尝试通过基类指针访问
Rectangle
类的私有成员,并预计由于私有成员的访问冲突而导致编译错误或运行时错误。然而,令我惊讶的是,代码编译和执行时没有任何错误,并且打印了预期的输出。我很好奇为什么会发生这种行为,因为我预计私有成员在它们所属的类之外是无法访问的。
代码中没有访问冲突错误。您需要关注 cpp 的两个主要功能。 后期绑定 (RTTI) 和 静态绑定(名称查找、上下文控制、访问控制)。
由于您从基类调用成员函数并且其访问说明符是公共的,因此静态绑定控制将通过。当代码运行时,将发生虚拟调度并调用派生类的成员函数。
因此,使用基类指针调用时,派生类的成员函数是否私有并不重要。