考虑以下代码:
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
”,因为m_i=1;
中的Derived()
首先发生,而m_i{10}
随后发生,这看起来很令人困惑。2)我也可以考虑其他原因:
想象以下情况-
Base()
构造函数引发异常,必须自己清理。如果我们已经初始化了
Derived
,这意味着我们现在也必须在Derived
之后进行清理,这是开销。
关于c++ - 为什么在派生类数据之前初始化基类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62438961/