1

我是 C++ 编程语言的新手,我对在继承中调用构造函数的顺序感到困惑。我的问题是,即使派生类没有继承构造函数和析构函数,为什么在我创建派生类对象时会调用基类构造函数。

4

1 回答 1

4

构造函数的目的是定义数据成员的初始化方式。由于派生类从基类继承数据成员,因此派生类的任何构造函数不仅必须定义如何初始化特定于派生类的数据成员,还必须定义来自基类的数据成员。

执行此操作(并且 C++ 标准要求)的自然方法是调用基类构造函数。如果您没有在派生类构造函数的初始化列表中包含特定的构造函数调用,则基类的默认构造函数将用于初始化基类成员。

struct base
{
   int _i;               // a data member
   base():_i(0) {}       // default constructor
   base(int i):_i(i) {}  // special constructor
};

struct derived : base
{
  int _j;                         // a data member specific to the derived class
  derived(int i, int j):_j(j) {}  // user-defined constructor for the derived class
};

上面的示例说明了派生类构造函数如何初始化其 member _j,但是_i来自基类的 member 必须使用基类构造函数进行初始化。

按照上面的写法,base::base()编译器会自动调用默认构造函数,即_i初始化为0。

但是您可以通过包含对特定构造函数的调用来更改该行为:

struct derived : base
{
  int _j;
  derived(int i, int j):base(i),_j(j) {}  // user-defined constructor for the derived class
};

构造函数调用的顺序是:首先调用基类的构造函数,然后是派生类特定成员的初始化程序。这是很自然的,因为从某种意义上说,派生类是基类的扩展,并且认为派生类对象的基类部分首先存在是有意义的。

于 2013-02-14T07:02:10.600 回答