我有一個鑽石的問題看起來是這樣的:複雜的菱形問題:C++虛繼承
__ A
/ |\
| B | \
v|/v v\|v \v
B2 B3 C
\v /v /
B4 /
\ /
D
我試過很多方法,使最佳的虛擬繼承得到沒有重複,但我無法找到一個解決方案。 A類包含一個位置。下面是一個輸出示例:
Call: A() position pointer is: 0x2203be8
Call: B()
Call: B2() position pointer is: 0x2203be8
Call: B3() position pointer is: 0x2203be8
Call: C() position pointer is: 0x2203a28
Call: B4() position pointer is: 0x2203be8
Call: D() position pointer is: 0x2203a28
爲什麼D和C沒有相同的位置指針?爲什麼這個A :: position沒有構造函數?我應該做些什麼虛擬繼承來解決這個問題?謝謝。
編輯:
下面是一個代碼示例:
class A;
class B;
class B2 : public virtual B, public virtual A;
class B3 : public virtual B, public virtual A;
class C : public virtual A;
class B4 : public virtual B2, public virtual B3;
class D : public B4, public C;
編輯2: 爲了使輸出,我把這個代碼的每個構造內:
A::A()
{
std::cerr << "Call: A() position pointer is: " << &_position << std::endl;
}
這是一個可怕的鑽石。 –
鑽石內的鑽石! –
您需要提供您正在使用的實際繼承關係。考慮在單個答案中使用格式(只提供'derived_type:[virtual] base,[virtual] base2 ...')。解釋你如何生成輸出也很有趣 –