是否可以在基类初始化器列表中传递成员对象
Is it OK to pass member object in base class initialiser list?
我有两个类,其中一个是基类,其中包含指向派生类上的成员对象的指针。
喜欢这个:
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 的指针并动态分配它)。
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++是否有定义的方法来传递指向类的成员对象的成员函数的指针
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 声明成员对象而不调用其默认构造函数
- 指向成员对象的指针 - 中断线程
- 将列表的对象C++移动到另一个对象
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 应该在成员对象上调用析构函数
- 调用成员对象的构造函数
- 如何从列表中将对象添加到图表中?
- 将 const 类型引用对象注册为类成员对象C++
- 修改类 c++ 中的成员对象
- 无法创建类型为无序链接列表的对象
- C++删除 for 循环中的列表成员
- 如何避免需要在初始化列表中初始化成员对象
- 是否可以在基类初始化器列表中传递成员对象
- 在构造函数的初始化列表中初始化时,何时构造成员对象?
- 省略数据成员对象的初始值设定项列表条目
- 没有默认构造函数的成员对象的初始化列表