上下文1:D类:公共B1,公共B2 {};
上下文2:B2采用B1初始化:B2(B1 *)// B2的构造函数
我的问题在于D的初始化列表:
D :: D():B1(),B2(?)...... 应该包含什么内容?
我不想把“(B1 *)这个”放在?因为在初始化列表中使用“this”并不好。由于B1部分已初始化,因此使用它是有意义的。
我该怎么办?
答案 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吗?