2013-10-04 9 views
0

다음 코드에서는 _tmain (..)에서 D :: f를 호출 할 때 모호한 오류가 발생합니다. B :: f가 A :: f를 재정의했기 때문에 A :: f, A :: f의 포인터 vtable은 B :: f를 가리 킵니다.C++ 상속 오류 : 모호한 오류

1) 왜 컴파일러가 모호한 오류를 발생시키는 이유는 무엇입니까? 누군가 분명히 해줄 수 있겠 어?

2) B :: f (int)를 B :: f (char)로 변경하여 A :: f (int)를 오버로드하려고 시도했지만 오류가 사라지지 않았습니다! 그게 왜?

상속 다이어그램 :

............A...... 
........../.|.\.... 
........A1..B..C... 
..........\.|./.... 
............D...... 

코드 : 당신은 struct A1에 대한 귀하의 상속 정의를 변경해야

struct A { 

virtual void f(int x) {cout << "A::f";}; 
virtual void g(int x) {cout << "A::g";}; 
private: int n; 
}; 
struct A1: A { 
virtual void h(int x) {f(x);}; 
}; 
struct B : virtual A { 
void f(int x) {cout << "B::f";}; 
}; 
struct C : virtual A { 
void g(int x) {cout << "C::g";}; 
}; 
struct D : A1, B , C { 

}; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    D* d = new D(); 
    d->f(1); 
    return 0; 
} 
+1

당신의 상속 다이어그램이 어떻게 생겼는지는 아닙니다. 그것은 [this] (http://pastebin.com/ksTpdXZE)와 같습니다. – jrok

답변

4

:

struct A1: virtual A { 

이유, diamond inheritance ambiguity. struct Df() 방법이 모두 A1B입니다. 이 클래스를 한 번만 상속하려면 모든 한정 클래스가 메소드를 가상 상속 받아야합니다.