将数据成员的指针传递给基类构造函数是否安全?

Is it safe to pass pointers to data members to base class constructor?

本文关键字:构造函数 基类 是否 安全 数据成员 指针      更新时间:2023-10-16

将数据成员的指针传递给基类构造函数是否安全? 即,派生类数据成员的内存布局是否至少在调用基类构造函数之前已经设置好,即使数据成员尚未初始化?

显然,取消引用指针只能在构造完成后完成,并且指向的对象已经有效。但问题是,一旦派生对象的构造完成,是否保证基类构造函数收到的指针实际上仍指向其对象。

动机是在基类中提供一些功能,例如遍历构造时提供的指向对象的指针,并在以后为每个对象执行一些操作。

可以只提供一个派生类可访问的 setter,但我很好奇在构造时提供指针是否也是安全的。

例:

#include <iostream>
#include <utility>
#include <vector>
struct Base {
Base(std::initializer_list<int*> ptrs = {}) : ptrs_(ptrs) {}
std::vector<int*> ptrs_;
};
struct Derived : public Base {
Derived() : Base{{&a_,&b_,&c_}} {}
int a_=1, b_=2, c_=3;
};
int main()
{
Derived obj;
for (auto* ptr : obj.ptrs_) { std::cout << *ptr << 'n'; }
}

https://wandbox.org/permlink/rDJw0UU8KcWckLlo

你的代码很好。但请注意,在基类构造函数中取消引用指针的行为是未定义的。

允许您将指针或对成员变量的引用传递给基类构造函数,但不得实际访问该基类构造函数中的对象。