2012-08-16 42 views
7

可能重复:
Why is it allowed to call derived class' private virtual method via pointer of base class?为什么我可以在C++从外部访问私有方法?

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

#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

这不是你访问它通过 – fork0 2012-08-16 12:22:07

+0

'A :: disp'是公共的类时;这是主要访问的唯一'disp'。 – 2012-08-16 12:22:49

回答

7

DISP()是公开的,因为你通过)的A *和DISP(被宣布为A.公共既然是虚拟的,B的版本显示的被调用调用它,但这并不影响它是否是公共或私人。

1

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

+2

这也是您申报的继承虚方法为'virtual',在我看来,好的做法。 – Aesthete 2012-08-16 12:25:39

+0

@Aesthete:同意。更易于阅读 – Andrew 2012-08-16 12:25:56

相关问题