다중 상속에서 모호성이 발생하는시기는 언제입니까?다중 상속에서 애매한 점이 언제 생깁니 까?
0
A
답변
4
1
struct Base{
void foo(){
}
};
struct Derived1 : public Base{
};
struct Derived2 : public Base{
};
struct Final : public Derived1, public Derived2{
};
int main(){
Final f;
f.foo();
}
See on Ideone. 다음
struct Derived1 : virtual public Base{
};
struct Derived2 : virtual public Base{
};
ambigouty에 대한 또 다른 가능성은 다음과 같습니다 : 수정하려면 가상 상속을 사용 다시
struct Base1{
void foo(){
}
};
struct Base2{
void foo(){
}
};
struct Final : public Base1, public Base2{
};
int main(){
Final f;
f.foo();
}
을 Ideone에. 해결하려면, 간단하게는 Final
에서 다음을 수행 : 다중 상속의 모호함의
struct Final : public Base1, public Base2{
using Base1::foo;
// or
// using Base2::foo;
};
3
한 유명한 예는 소위 다이아몬드 문제입니다.
요약 : 다중 상속 및 지식 조직이있는 객체 지향 프로그래밍 언어에서 다이아몬드 문제는 두 개의 클래스 B와 C가 A에서 상속 받았을 때 발생하는 모호성이며 클래스 D는 B와 C에서 상속됩니다. D의 메소드는 A에 정의 된 메소드를 호출하고 (메소드를 대체하지는 않습니다.) B와 C는이 메소드를 다르게 재정의 한 후 어떤 클래스에서 B 또는 C를 상속합니까? "
현재 세부 사항을 찾을 수 있습니다 Wikipedia: Diamond Problem
0
를가 같은 클래스가 하나 개 이상의 경로를 통해 기본 때
class baseX
{
private:
void* callA();//will never be ambiguous.
protected:
void* callB();
public:
void* callC();
}
class baseY
{
private:
void* callA();//will never be ambiguous.
protected:
void* callB();
public:
void* callC();
}
class derived: public baseX, public baseY
{
void someMethod()
{
void* x = baseX::callB();//not ambiguous
void* y = baseY::callB();//not ambiguous
void* z = callB();//ambiguose
}
}
void someFunction(derived& d)
{
void* x = d.CallC();//ambiguous
}
모호함도 발생할 수 불분명 사용되는 이름을 만드는 경우 :
class Base
{
public void call();
}
class DerivedX : public Base
{
}
class DerivedY : public Base
{
}
class GrandChild : public DerivedX, public DerivedY //What does call() do?
{
}
을
가상베이스로 해결할 수 있습니다.
class Base
{
public void call();
}
class DerivedX : public virtual Base
{
}
class DerivedY : public virtual Base
{
}
class GrandChild : public DerivedX, public DerivedY //only one "Base" class in inheritance, shared between DerivedX and DerivedY
{
}
관련 문제
- 1. 왜 여기에 StackOverflowError가 생깁니 까?
- 2. 왜 줄 바꿈이 생깁니 까?
- 3. EntityFramework의 NullReferenceException은 어떻게 생깁니 까?
- 4. Django에서 권한 생성은 어디에서 생깁니 까?
- 5. 왜 데이터베이스보기에서 선택하면 열려있는 트랜잭션이 생깁니 까?
- 6. JSPX로 복사 - 붙여 넣기 코드가 생깁니 까?
- 7. XSLT를 사용하면 HTML 페이지가 생깁니 까?
- 8. Git : 장면 뒤에 무엇이 생깁니 까
- 9. 완벽한 상태 보고서는 어떻게 생깁니 까?
- 10. 왜 프레임 버퍼가있는 흰색 사각형이 생깁니 까?
- 11. 다중 상속에서 오브젝트 포인터가 다른 경우에도 왜 동일합니까?
- 12. Clearcase UCM : 병합 작업으로 분기 간의 종속성이 생깁니 까
- 13. TPanel을 TToolBar에 추가하면 TPanel 또는 TToolButton이 생깁니 까?
- 14. 어떻게 vim에 이것을 붙여 넣을 지, 구문 오류가 생깁니 까?
- 15. Ruby에서 Java 정적 메서드는 어떻게 생깁니 까? 자바에서
- 16. 어떻게 ruby.exe/IRB를 실행하면 빈 DOS 셸이 생깁니 까?
- 17. - NSWindowController가 윈도우로 초기화되면 [NSWindowController window] 유지 윈도우가 생깁니 까?
- 18. 왜 SSRS 2005 선 그래프에서 깨진 선이 생깁니 까
- 19. Kohana에서 데이터베이스 및 세션 설정은 어떻게 생깁니 까?
- 20. 그리드에서 셀을 선택하면 인접 셀을 통해 바깥쪽으로 나선형이 생깁니 까?
- 21. TTNavigator는 와일드 카드 페이지로 이동합니다. 어떤 생각이 생깁니 까?
- 22. UML에서 "인터페이스 확장 인터페이스"관계는 어떻게 생깁니 까?
- 23. DataTemplate을 MenuItem에 사용하면 왼쪽에 여유 공간이 생깁니 까?
- 24. 엔티티 프레임 워크 컨텍스트는 어떻게 생깁니 까? web.config에서 읽습니까?
- 25. Python - urllib2.urlopen - 왜 왜곡 된 문자가 생깁니 까?
- 26. 화면을 잠그고 응용 프로그램으로 돌아갈 때 무슨 일이 생깁니 까?
- 27. 간단하지만 애매한 표현
- 28. 데이터베이스 데이터를 언제 추가 물에 넣을 까
- 29. 가상 함수가 상속에서 이상하게 작동합니까?
- 30. 누가 가상 상속에서 생성자를 호출합니까?
조금 더 자세히 알려주세요. 어쩌면 예를 들어? –
무엇이 모호한가에 달려 있습니다. 한 번 이상 상속 된 동일한 기본 클래스를 사용하여 다이아몬드 상속을 가질 수 있습니다. 또는 액세스 권한을 명시해야하는 동일한 이름의 공용/보호 된 멤버 변수/함수가있는 여러 개의 기본 멤버를 가질 수 있습니다. – Erik
질문을 올리기 전에 좀 더 많은 조사를해야 할 곳입니다. 질문에 명확성이 있다면 대답은 당신이 찾고있는 것에 더 많은 통찰력을 갖게합니다. – sjsam