C++ 为什么基类数据在派生类数据之前初始化
考虑以下代码:C++ 为什么基类数据在派生类数据之前初始化,c++,inheritance,initialization,C++,Inheritance,Initialization,考虑以下代码: 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; } 当导出d时;实例化C++首先调用基本构造函数并初始化BASIC的数据-MYI,然后调用派生构造函数并初始化派生的数
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;
}
当导出d时;实例化C++首先调用基本构造函数并初始化BASIC的数据-MYI,然后调用派生构造函数并初始化派生的数据-Myf.< /P>
但原因是什么呢
为什么C++没有用另一种方式来做?p>
因为,据我所知,它并不是更快什么的。1它的主要原因是派生类应该可以访问基类字段 让我举例说明:
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"
}
如果以相反的方式进行初始化,则派生数据库可能会访问Base中未初始化的数据,这是错误的
此外,派生构造函数无法正确更改基字段值,并且会打印派生的m_f=100,m_i=10,因为m_i=1;在这种情况下,派生将首先发生,然后发生m_i{10},这看起来很混乱
2我还可以考虑另一个原因:
想象一下,下面的基构造函数抛出异常,并且必须自己清理
如果我们已经初始化了派生,这意味着我们现在也必须在派生之后进行清理,这是开销。1主要原因是派生类应该可以访问基类字段 让我举例说明:
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"
}
如果以相反的方式进行初始化,则派生数据库可能会访问Base中未初始化的数据,这是错误的
此外,派生构造函数无法正确更改基字段值,并且会打印派生的m_f=100,m_i=10,因为m_i=1;在这种情况下,派生将首先发生,然后发生m_i{10},这看起来很混乱
2我还可以考虑另一个原因:
想象一下,下面的基构造函数抛出异常,并且必须自己清理
如果我们已经初始化派生,它意味着我们现在必须在派生之后清理,这是开销。< /p>如果你正在建造房子,你是从屋顶还是基础开始?如果你正在建造房子,你是从屋顶还是基础开始?