将数据成员的指针传递给基类构造函数是否安全?
Is it safe to pass pointers to data members to base class constructor?
将数据成员的指针传递给基类构造函数是否安全? 即,派生类数据成员的内存布局是否至少在调用基类构造函数之前已经设置好,即使数据成员尚未初始化?
显然,取消引用指针只能在构造完成后完成,并且指向的对象已经有效。但问题是,一旦派生对象的构造完成,是否保证基类构造函数收到的指针实际上仍指向其对象。
动机是在基类中提供一些功能,例如遍历构造时提供的指向对象的指针,并在以后为每个对象执行一些操作。
可以只提供一个派生类可访问的 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
你的代码很好。但请注意,在基类构造函数中取消引用指针的行为是未定义的。
允许您将指针或对成员变量的引用传递给基类构造函数,但不得实际访问该基类构造函数中的对象。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- C++虚拟函数:基类函数是调用的,而不是派生的
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基继承?
- 具有多个非默认构造函数基的Singleton派生类
- 调用基默认构造函数模板类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 构造所有基类不需要默认生成的构造函数