为什么基类数据在派生类数据之前初始化
Why is the Base class data initialized before Derived class data
请考虑以下代码:
class Base {
public:
Base(): m_i{10} {}
private:
int m_i;
};
class Derived: public Base {
public:
Derived(): m_f{100.0} {}
private:
float m_f;
};
int main() {
Derived d;
}
当Derived d;
被实例化时C++首先调用构造函数Base()
并初始化Base
的数据 -m_i
- 然后才调用Derived()
构造函数并初始化Derived
的数据 -m_f
。
但是这是什么原因呢?
为什么C++不以另一种方式做到这一点?
因为,据我所知,它不是更快或其他什么。
1(它的主要原因是 -Derived
类应该有权访问Base
类字段。
让我用一个例子来解释:
class Base {
public:
Base(): m_i(10) {}
protected:
int m_i;
};
class Derived: public Base {
public:
Derived(): m_f(100.0) {
m_i = 1;
}
void print() {
std::cout << "Derived m_f=" << m_f << ", m_i=" << m_i << 'n';
}
private:
float m_f;
};
int main() {
Derived d;
d.print(); // prints: "Derived m_f=100, m_i=1"
}
如果初始化以相反的方式发生,Derived
可以访问Base
中未初始化的数据,这是不好的。
此外Derived()
构造函数将无法正确更改Base
字段值,并且您将打印"Derived m_f=100, m_i=10
",因为Derived()
中的m_i=1;
将首先发生,m_i{10}
接下来会发生,它看起来很混乱。
2(我也可以考虑其他原因:
想象一下以下内容 -Base()
构造函数抛出异常,并且必须在自己之后进行清理。
如果我们已经初始化了Derived
则意味着我们现在也必须在Derived
之后进行清理,这是开销。
相关文章:
- 如何使用数据对象上的常量指针初始化类
- C++中数据初始化的不同方式
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如何使用派生类类型数据初始化 std::shared_ptr?
- 委派复制构造函数和常量数据初始化
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 使用类/对象实例数据初始化对话框
- 使用数据初始化 cv::Mat 不起作用
- 使用函数中的数据初始化C++ const 成员 (MPI_comm_size/rank)
- 如何故意用未初始化的数据初始化变量,以便valgrind将该变量视为未初始化
- 使用通用数据初始化多个C++数组
- 特征库 --> 使用文件或现有 std::vector<string> content (c++) 中的数据初始化矩阵
- 使用联合数组中的数据初始化std::向量
- 新操作员的内存分配和数据初始化
- 用动态分配的数据初始化cv::Mat
- 如何用预制数据初始化指针到指针
- 如何用该类的其他成员数据初始化类成员数据
- c++中静态数据初始化的时间和方式
- 将大量数据初始化到C++容器中的最佳方法
- 如何使用浮点数组中的数据初始化 cv::Mat