2012-08-16 3 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

+0

'A :: disp' is public; 그게 주인이 접근하는 유일한 'disp'야. –

답변

7

disp()는 A *를 통해 호출하고 disp()는 A에서 public으로 선언하므로 public입니다. 가상이므로 B의 disp 버전이 호출되지만 영향을 미치지 않습니다. 공개 또는 비공개.

1

언어 디자인입니다. 그러나 유추 할 때 메소드 보호 수준을 강화하는 것은 나쁜 습관입니다.

+2

상속 된 가상 메소드를'virtual'으로 선언하는 것도 좋은 습관입니다. – Aesthete

+0

@Aesthete : agree. 더 읽기 쉬움 – Andrew

관련 문제