在初始化列表中使用超类的地址/指针

时间:2010-04-12 05:09:41

标签: c++ multiple-inheritance superclass this-pointer

上下文1:D类:公共B1,公共B2 {};

上下文2:B2采用B1初始化:B2(B1 *)// B2的构造函数

我的问题在于D的初始化列表:

D :: D():B1(),B2(?)...... 应该包含什么内容?

我不想把“(B1 *)这个”放在?因为在初始化列表中使用“this”并不好。由于B1部分已初始化,因此使用它是有意义的。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

使用B1的{​​{1}}部分是可以的,因为它已经初始化了。 §12.6.2/ 5:“直接基类应按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何)。”

此处的base-specifier-list为this,mem-initializer-list为class D : public B1, public B2

我会说这有“代码味”,但是。

编辑:现在我理解你的担忧,D::D() : B1(), B2( … )是否在构造函数体外是未定义的,不包括成员初始值设定项。允许这种情况的语言埋藏在两个例子之间,我一开始就错过了它。第7段:“mem-initializer的表达式列表中的名称在构造函数的范围内进行评估, 指定了mem-initializer。“

如果this实际上需要保留指向B2的指针,并且该指针始终指向最派生的对象,请考虑虚拟继承。

B1

答案 1 :(得分:1)

这是有风险的代码。如前所述,B1是在B2之前构造的,所以你可以安全地做到这一点,但如果类定义发生变化,将不再是这种情况,并且它在代码中处于无关的位置,所以你看不到打破它时你打破的代码。

我仔细研究这个设计 - 是否可以改变它以使其不必要?你可以将事物转移到成员中​​来封装而不是继承 - D真的是B1和B2吗?