7

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

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

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

4

2 回答 2

7

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

于 2012-08-16T12:22:59.667 回答
1

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

于 2012-08-16T12:23:10.447 回答