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

标签 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;
}

实例化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/

相关文章:

c++ - 关于如何将来自不同层次结构的对象组合在一起以创建新对象的任何想法

java - Hibernate 继承 - 没有用 Id 注释的字段

initialization - Go if 语句中的多个初始值设定项

javascript - 从父模型继承 Backbone 属性

c++ - union 作为基类

c++ - 将类模板转换为 SFINAE 和构造函数委托(delegate),现在出现编译器错误

c++ - 二维 std::array 的列表初始化

c++ - 大小为 k 的数组(大小为 n)的子集数,最大和最小元素之差最多为 x

C++ 显式构造函数

c++ - QT QNetworkAccessManager 从 ftp 服务器下载文件不工作