2012-04-10 38 views
1

我現在正在學習C++虛擬派生中不確定性的不同情況。 但我有歧義的錯誤在我的代碼,我不知道這是原因......虛擬派生與轉換模糊

這裏是我的代碼:

class V { 
    public: 
     int v ; 
}; 

class A { 
    public: 
     int a ; 
}; 

class B : public A, public virtual V { 

}; 

class C : public A, public virtual V { 

}; 

class D : public B, public C { 
    public: 
     void f() ; 
}; 

void g() { 
    D d ; 
    B* pb = &d ; // No Problem 
    A* pa = &d ; // Error: 'A' is ambiguous base of 'D' 
    V* pv = &d ; // No Problem 
} 

我不明白爲什麼我有這個錯誤,但我沒有錯誤的其他情緒。

謝謝:-)

回答

2

這在multiple inheritance案件完全預期。我們這裏有一個鑽石繼承的例子。 D現在有兩個副本A,一個從B繼承而來,另一個從C繼承。你需要指定哪個B或C的成員暴露給D來自哪裏。

參見:Using C++, how do I correctly inherit from the same base class twice?

你可能會考慮:

  • 使用虛擬繼承:

    class B : public virtual A, public virtual V {...};

    class C : public virtual A, public virtual V {...};

  • 使用compositio n作爲多重繼承的一種方式。

我建議閱讀Solving the Diamond Problem with Virtual Inheritance

+1

謝謝。但是它們都是從A繼承而來的。那麼這種假裝有什麼問題呢?謝謝 – Copernic 2012-04-10 18:02:24

+0

@Mehdi - D *不能*繼承A的兩個實例。想一想 - 如果A包含公共屬性「a」,那麼B和C都有一個屬性「a」。現在D有兩個屬性「a」 - 編譯器應該使用哪一個?它不能將它們合併 - 並不那麼簡單。這就是爲什麼它不能編譯。 – Alain 2012-04-10 18:04:29

+0

Aaah。現在我明白了 !! 非常感謝你@Alain :) – Copernic 2012-04-10 18:08:23