为什么基类数据在派生类数据之前初始化

Why is the Base class data initialized before Derived class data

本文关键字:数据 初始化 派生 基类 为什么      更新时间:2023-10-16

请考虑以下代码:

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之后进行清理,这是开销。