是否可以在基类初始化器列表中传递成员对象

Is it OK to pass member object in base class initialiser list?

本文关键字:列表 成员对象 初始化 基类 是否      更新时间:2023-10-16

我有两个类,其中一个是基类,其中包含指向派生类上的成员对象的指针。

喜欢这个:

class Bar { };
class Foo : Bar { };
class A
{
    public:
         A(Foo *foo) { this->foo = foo };
    private:
        Foo *foo;
}
class B : public A
{
    public:
        B() : A(&bar) { };
    private:
        Bar bar;
}

我的问题是:在将B.bar作为初始化参数传递给A的构造函数之前,是否保证分配

换句话说:如果我创建一个B实例,B->foo保证是指向Bar实例的有效指针吗?

基子对象在成员对象之前构造。对所有成员的指针和引用都是有效的,但在构造实际对象之前,您不得访问这些对象。

请记住,虽然特定示例有效(对象被分配,因此获取其成员的地址有效),但它不是一个普遍有效的模式(我刚刚通过努力学习)。

将 B* 隐式强制转换为 A*,在这种情况下是微不足道的,在具有虚拟方法和更复杂的对象的情况下可以引入偏移量(它可以在未初始化的内存上执行),并且在虚拟继承的情况下会导致 SegFault - 如果 B 虚拟继承了 A,并且作为实现细节 B 包含指向 A 的指针并动态分配它)。