C++中通过基类指针和虚函数访问派生类的私有成员

问题描述 投票:0回答:1

我在 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
类的私有成员,并预计由于私有成员的访问冲突而导致编译错误或运行时错误。然而,令我惊讶的是,代码编译和执行时没有任何错误,并且打印了预期的输出。我很好奇为什么会发生这种行为,因为我预计私有成员在它们所属的类之外是无法访问的。

c++ oop pointers polymorphism virtual-functions
1个回答
0
投票

代码中没有访问冲突错误。您需要关注 cpp 的两个主要功能。 后期绑定 (RTTI)静态绑定(名称查找、上下文控制、访问控制)。

由于您从基类调用成员函数并且其访问说明符是公共的,因此静态绑定控制将通过。当代码运行时,将发生虚拟调度并调用派生类的成员函数。

因此,使用基类指针调用时,派生类的成员函数是否私有并不重要。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.