2013-10-04 51 views
0

在下一個代碼中,在_tmain(..) 中調用D :: f時出現模糊錯誤,因爲B :: f覆蓋A :: f,指向f中的指針A :: vtable指向B :: f。C++繼承錯誤:模棱兩可的錯誤

1)爲什麼編譯器會給出模糊的錯誤?有人可以請清楚嗎?我試圖通過將B :: f(int)更改爲B :: f(char)來重載A :: f(int),但錯誤沒有消失!這是爲什麼?

的繼承圖:

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

代碼:

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

struct A1: virtual A { 

究其原因,diamond inheritance ambiguitystruct DA1B獲得方法f()。要只繼承一次,所有符合條件的類都必須虛擬地繼承該方法。