2016-09-07 2 views
2

나는 상속 문제가있어 : 의 내가C++ 상속 모호한 기능

class Time{ 
protected: 
void foo(); 
}; 

또한

class Base: private Time{ 
void foo1(){ foo(); } 
}; 

class Child: public Base, private Time{ 
void foo2(){ foo(); }// here my compiler says that foo is ambiguous 
}; 

있어 가정 해 봅시다 왜, foo는()가 모호한 상속의 경우 기본 시간은 비공개입니까?

추신. 전체 코드를 볼 필요가있는 사용자 만이 &입니다. GitHub 프로젝트는 다음과 같습니다. https://github.com/huntekah/Interior_decorator-OpenGL_Project/blob/master/Grafika-OpenGL/Interior_decorator/Display.cpp#L133 클래스 Time (유틸리티 디렉토리)은 Control의 기본이되는 ControlObjects 및 ControlCamera에 상속됩니다. Display는 Controls를 상속받으며 Time을 추가로 상속받습니다. 주석 행은 SetDeltaTime()이 모호한 곳을 보여줍니다.

+0

개인은 그것을 숨기지 않습니다. – Jarod42

+0

'Base'와'Time' 모두'foo'라는 이름의 멤버 함수를 가지고 있기 때문에 컴파일러는 여러분이 호출하려고 시도하는 것을 모른다. 이 어딘가가 어딘가에 있습니다. –

+0

베이스 안의 네임 스페이스가 숨 깁니다. –

답변

0

예비 발언 귀하의 코드가 다른 이유 컴파일되지 않습니다

: 그것은 개인 구성원으로 BaseTimefoo()에 액세스 할 수 없습니다. 따라서 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 상속을 통해옵니다. 따라서 모호성을 해결하더라도 액세스 가능성에 대한 또 다른 오류 메시지가 표시됩니다.

1

코드에 또 다른 오류가 있습니다. 클래스 base가 개인적으로 클래스 Time에서 상속하고 클래스 class가 클래스 시간에서 다시 개인적으로 상속받습니다 !!!

상속의 법칙 : 그것에서 상속 때문에

class Time 
{}; 

class Base : private Time 
{}; 

class Child : public Base, private Time 
{}; 

자료는 수업 시간의 복사본을 가지고있다.

자식이 상속하기 때문에 하위 클래스의 복사본이 있습니다.

*** 하위 (부모) (Base)가이 복사본을 가지고 있기 때문에 하위 클래스의 복사본이 있습니다.

자식 클래스에서 명시 적으로 상속하려고하면 컴파일 타임 오류가 발생합니다. 오류 C2584 : '하위': 직접적인베이스 '시간'에 액세스 할 수 없습니다. 이미 기지 'Base'