为什么我可以在C++从外部访问私人方法

why I can access private method from outside in C++?

本文关键字:方法 访问 从外部 我可以 C++ 为什么      更新时间:2023-10-16

可能的重复项:
为什么允许通过基类的指针调用派生类的私有虚拟方法?

最近,我遇到了一个奇怪的问题,请参考以下代码:

#include <iostream>
using namespace std;
class A
{
    public:
        virtual void disp() {
            cout<<"A disp"<<endl;
        }
};
class B : public A
{
    private:
        void disp() {
            cout<<"B disp"<<endl;
        }
};
int main()
{
    A a;
    a.disp();
    A *b = new B();
    b->disp();
}

输出为:

A disp
B disp

我想知道为什么指针 b 可以访问 disp()?这是私人的!不是吗?

disp() 是公共的,因为你通过 A* 调用它,而 disp() 在 A 中声明为公共。由于它是虚拟的,因此调用了 B 的 disp 版本,但这不会影响它是公共的还是私有的。

这是语言设计。但是,在派生时加强方法保护级别是一种不好的做法