【问题标题】:why I can access private method from outside in C++? [duplicate]为什么我可以在 C++ 中从外部访问私有方法? [复制]
【发布时间】:2012-08-16 12:20:57
【问题描述】:

可能重复:
Why is it allowed to call derived class' private virtual method via pointer of base class?

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

#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()?是私人的!不是吗?

【问题讨论】:

  • 它不适用于您访问它的课程
  • A::disp 是公开的;这是 main 访问的唯一 disp

标签: c++


【解决方案1】:

disp() 是公共的,因为您通过 A* 调​​用它,并且 disp() 在 A 中被声明为公共。由于它是虚拟的,因此 B 的 disp 版本被调用,但这并不影响它是否是公共的或私人的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在我看来,将继承的虚拟方法声明为 virtual 也是一个好习惯。
    • @Aesthete:同意。更容易阅读
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2020-12-12
    • 2023-03-14
    • 2014-08-31
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多