2011-01-05 4 views
6

기본 클래스에서 오버로드 된 메서드와 private/protected로 상속 된 파생 클래스가 있다고 가정합니다.기본 클래스 오버로드 선언 액세스 방법

  1. 오버로드 된 메서드의 원래 액세스 수준 중 하나만 복원 할 수 있습니까?
  2. GCC 4.4.0에서 나는 기본 접근법을 보호 된 접근법으로 놓고 개인 접근을 사용하여 상속받습니다. 공개 수준으로 액세스 수준을 복원하려고 시도하면 작동합니다! 이것이 어떻게 작동하는 것입니까? 또는 컴파일러의 버그입니까? 내 이해를 위해 액세스 수준 복원은 회원의 액세스 수준을 승격 또는 강등하는 데 사용할 수 없어야합니다.

코드 :

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

BTW-는'base :: method'를 사용하는 것과 정확히 같은'base :: method'와 같은 선언입니까? – Kos

+0

@Kos, 네, 그렇지만 C++ 0x에서'base :: method;'라고 말하는 것은 더 이상 유효하지 않습니다. n3225 초안에서 제거되었습니다. –

답변

4

using 선언 만 이름 선언적 영역으로 도입하는 단순한 이유로 주어진 과부하 selectively 수행 할 수 없으며, 그 정의에 과부하가 동일한 공유 functions 이름.

내가 여기에 볼 수있는 유일한 대안은 사소한 전송 기능을 사용하는 것입니다

class derived : private base 
{ 
public: 
    void method() { base::method(); } 

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

내가 두 번째 질문을 이해 확실히 모르겠지만, 예 : 당신은을 통해 파생 클래스에서 기본 멤버의 접근성을 변경할 수 있습니다 using 선언.

+0

완벽하고 고마워요. 이것을 두 번째 질문에 대한 @DeadMG 대답과 결합하면 우리는 해결 된 문제를 표시 할 수 있습니다 .. –

1

당신은 그 자체 액세스를 복원하지 마십시오. 으로 설정하십시오. 위에서 수행 한 것처럼 이전에 private으로 선언 된 메소드를 포함하여 모든 메소드에 대한 액세스를 명시 적으로 설정할 수 있습니다.

1

파생 된 클래스가 원한다면 보호 된 메서드가 공개되지 않도록하는 것은 불가능합니다. 즉, 작은 래퍼를 작성하고 완료 할 수 있기 때문입니다. private은 또 다른 문제입니다. a using 선언 through 유전 함수 접근성 변경

+0

akh ... 네 .. 그 말이 맞아 .. 고마워 .. "C++ Complete References 4th Ed."에서 챕터를 읽었으며 "액세스 선언을 사용하여 액세스 권한을 복원 할 수 있습니다. 공개 및 보호 된 회원이지만 액세스 선언을 사용하여 액세스 상태를 높이거나 낮추는 것은 불가능합니다. 예를 들어 기본 클래스에서 private로 선언 된 멤버는 파생 클래스에서 공개로 설정할 수 없습니다. (C++이 허용되면 ) 이것이 발생하면, 그것은 캡슐화 메커니즘을 파괴 할 것입니다!) ".. 그래서 나는 그가 공개적이고 보호 된 것을 의미한다고 생각합니다. –

관련 문제