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>如果你正在建造房子,你是从屋顶还是基础开始?如果你正在建造房子,你是从屋顶还是基础开始?