私はこのように見えるダイヤモンドの問題があります。複雑なダイヤモンドの問題: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のコンストラクタがないのですか?これを解決するために私はどのような仮想継承をすべきですか?ありがとう。
EDIT:
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;
はEDIT 2:
はここでのサンプルコードの出力を行うために 、私はそれぞれのコンストラクタ内でこのコードを配置:
あなたは何のコードA::A()
{
std::cerr << "Call: A() position pointer is: " << &_position << std::endl;
}
これは恐ろしい外観のダイヤモンドです。 –
ダイアモンド内のダイヤモンド! –
使用している実際の継承関係を提供する必要があります。 1つの答えの形式を使用することを検討してください( 'derived_type:[virtual] base、[virtual] base2 ...')。どのように出力を生成しているのかを説明することも興味深いでしょう –