액세스 제어가 과부하 해결 전에 왔다고 가정합니다. 사실상 이것은 public/protected/private
접근성보다는 통제 된 가시성을 의미합니다 .
Stroustrup 의 Design and Evolution of C ++ 의 섹션 2.10 에는 이에 대한 구절이 있으며 여기에서 다음 예제를 논의합니다.
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
스트로브 스트 룹은 현재의 규칙 (접근성 전에 가시성)의 혜택 (일시적으로)을 chaning이 있음을 언급 private
내부 class X
에 public
(예를 들어, 디버깅의 목적을 위해) 위의 프로그램의 의미에는 조용한 변화 (즉이 없다는 것입니다 X::a
에 시도 두 경우 모두 액세스 할 수 있으며 위의 예에서 액세스 오류가 발생 함). 경우 public/protected/private
가시성을 제어 할 프로그램의 의미는 (글로벌이 변경됩니다 a
호출 할 것이다 private
, 그렇지 않으면,X::a
).
그런 다음 그는 이것이 명시적인 설계에 의한 것인지 아니면 표준 C ++에 대한 Classess 이전 버전으로 C를 구현하는 데 사용 된 전 처리기 기술의 부작용인지 기억하지 못한다고 말합니다.
이것이 당신의 예와 어떤 관련이 있습니까? 기본적으로 표준에서 오버로드 확인을 만들었 기 때문에 이름 조회가 액세스 제어보다 먼저 발생한다는 일반적인 규칙을 준수합니다.
10.2 멤버 이름 조회 [class.member.lookup]
1 멤버 이름 조회는 클래스 범위 (3.3.7)에서 이름 (id-expression)의 의미를 결정합니다. 이름 조회로 인해 모호성이 발생할 수 있으며이 경우 프로그램의 형식이 잘못되었습니다. id-expression의 경우 이름 조회는 this의 클래스 범위에서 시작됩니다. 규정 된 ID의 경우 이름 조회는 nestedname- 지정자의 범위에서 시작됩니다. 이름 조회는 액세스 제어 전에 발생합니다 (3.4, 11 절).
8 오버로드 된 함수의 이름이 모호하지 않은 경우
액세스 제어 전에 오버로드 해결 (13.3)도 발생 합니다. 모호성은 종종 클래스 이름으로 이름을 한정하여 해결할 수 있습니다.