예비 발언 귀하의 코드가 다른 이유 컴파일되지 않습니다
: 그것은 개인 구성원으로 Base
은 Time
의 foo()
에 액세스 할 수 없습니다. 따라서 foo1()
은보고 된 모호성이 있기 전에 오류를 발생시킵니다.
당신은 그것의 회원을 보호하기 위해 Time
을 변경하는 경우에, 당신은 당신이 설명대로 정확하게 오류를 재현 할 수 있습니다
class Time{
protected:
void foo();
};
여기에 어떤 문제가 있습니까?
Base
은 개인적으로 Time
을 상속하므로 외부 세계에 보이지 않을 것으로 예상됩니다.
그러나 파생 클래스의 경우 외부 세계에 대해 사실 일 수는 없습니다. 유도의 경우 이름 조회 규칙이 먼저 이름이 클래스 계층 구조에서보고되고 있다고 전용 액세스 제어가 수행되는 것보다, 다음, 적용 과부하 :
10.2/1 Member name lookup determines the meaning of a name (id-expression) in a class scope. Name lookup can result in an ambiguity, in which case the program is ill-formed. For an id-expression, name lookup begins in the class scope of this; for a qualified-id, name lookup begins in the scope of the nested-name-specifier. Name lookup takes place before access control.
10.2/8 If the name of an overloaded function is unambiguously found, overloading resolution also takes place before access control. Ambiguities can often be resolved by qualifying a name with its class name.
당신이 다중 상속을 사용할 때 :
Time
:
:
Base Time
\ :
\ :
Child
따라서 foo()
번은 개인 상속을 통해 한 번 상속 받았으며 공개를 통해 한 번 상속받습니다. 이러한 모호성으로 인해 표준에 따라 foo
의 이름이 foo2()
으로 모호하며 액세스가 확인되기 전에 코드가 유효하지 않게됩니다.
어린이는 2 개의 foo()를보고 있지만 아이러니하게도 그 중 하나를 사용할 수 없다는 점에 유의하십시오. 둘 다 private 상속을 통해옵니다. 따라서 모호성을 해결하더라도 액세스 가능성에 대한 또 다른 오류 메시지가 표시됩니다.
개인은 그것을 숨기지 않습니다. – Jarod42
'Base'와'Time' 모두'foo'라는 이름의 멤버 함수를 가지고 있기 때문에 컴파일러는 여러분이 호출하려고 시도하는 것을 모른다. 이 어딘가가 어딘가에 있습니다. –
베이스 안의 네임 스페이스가 숨 깁니다. –