gpt4 book ai didi

c++ - 在初始化列表中使用父类(super class)的地址/指针

转载 作者:太空狗 更新时间:2023-10-29 21:08:40 25 4
gpt4 key购买 nike

上下文 1:D 类:公共(public) B1、公共(public) B2{};

context 2: B2 takes B1 to initialize: B2( B1 * )//B2的构造函数

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

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

我不想在 ?地方,因为在初始化列表中使用“this”是不好的。并且由于 B1 部分已经初始化,所以使用它是有意义的。

我该怎么办?

最佳答案

可以使用 B1的一部分 this因为已经初始化了。 §12.6.2/5:“直接基类应按照它们出现在基说明符列表中的声明顺序进行初始化(无论内存初始化器的顺序如何)。”

此处的基本说明符列表是 class D : public B1, public B2 , 内存初始化器列表是 D::D() : B1(), B2( … ) .

不过,我会说这有“代码味道”。

编辑:现在我理解你的担忧,无论是this在构造函数主体之外未定义,其中不包括成员初始值设定项。允许这样做的语言隐藏在两个例子之间,一开始我错过了。第 7 段:“内存初始化器的表达式列表中的名称在构造函数的范围内进行评估,指定了内存初始化程序。”

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

class B1 {};
class B2 : virtual B1 {}; // under the hood, B2 has a pointer to B1.
class D : public virtual B1, public B2 {}; // D has a pointer too
// Only the most-derived class (the one actually used for instantiation)
// implements space for and initialization of the B1.

关于c++ - 在初始化列表中使用父类(super class)的地址/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com