【发布时间】:2012-11-05 13:22:49
【问题描述】:
我有一个看起来像这样的钻石问题:
__ 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 ...')。解释一下你是如何生成输出的也会很有趣
-
继承真的是你想要(需要)的吗?有时答案是否定的。您还有其他选择继承。考虑一下!
-
“位置指针”的值是如何确定的?
-
位置指针只是A类的受保护成员。我使用了一个空的构造函数。
标签: c++ multiple-inheritance virtual-inheritance