Gui*_*cot 5 c++ multiple-inheritance virtual-inheritance
我有一个钻石问题,看起来像这样:
__ A
/ |\
| B | \
v|/v v\|v \v
B2 B3 C
\v /v /
B4 /
\ /
D
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法来制作最好的虚拟继承,以获得没有重复,但我找不到解决方案.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
Run Code Online (Sandbox Code Playgroud)
为什么D和C没有相同的位置指针?为什么这个A ::位置没有构造函数?我应该用什么虚拟继承来解决这个问题?谢谢.
编辑:
这是一个代码示例:
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;
Run Code Online (Sandbox Code Playgroud)
编辑2:为了输出,我把这个代码放在每个构造函数中:
A::A()
{
std::cerr << "Call: A() position pointer is: " << &_position << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
您目前有什么代码?看起来解决方案将是:
class D;
class C : public virtual D;
class B4 : public virtual D;
class B2 : public virtual B4;
class B3 : public virtual B4;
class B : public B2, public B3;
class A : public B2, public B3, public C;
Run Code Online (Sandbox Code Playgroud)
根据你的图表。如果我读错了,A 是基础,而不是 D。那么它需要看起来像这样:
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;
Run Code Online (Sandbox Code Playgroud)