可能重复:
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()?这是私人的!不是吗?
答案 0 :(得分:7)
disp()是公共的,因为你通过A *调用它,而disp()在A中被声明为public。因为它是虚拟的,所以调用B的disp版本,但这不会影响它是否公开或私人。
答案 1 :(得分:1)
这是语言设计。然而,在推导
时加强方法保护水平是一种不好的做法