我是C ++编程语言的新手,我对继承中调用构造函数的顺序感到困惑。我的问题是即使构造函数和析构函数不是由派生类继承的,为什么基类构造函数在创建派生类对象时会调用。
答案 0 :(得分:3)
构造函数的目的是定义如何初始化数据成员。由于派生类从基类继承数据成员,因此派生类的任何构造函数不仅必须定义如何初始化特定于派生类的数据成员,还要定义来自基类的数据成员。
执行此操作(以及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
};
上面的示例说明了派生类构造函数如何初始化其成员_j
,但是来自基类的成员_i
必须使用基类构造函数初始化。
如上所述,编译器将自动调用默认构造函数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
};
构造函数调用的顺序是:基类的第一个构造函数调用,然后是派生类特定成员的初始化程序。这很自然,因为派生类在某种意义上是基类的扩展,将派生类对象的基类部分视为是有意义的首先是。