次のような菱形継承問題があります。
__ 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;
}