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
};
1 回答
构造函数的目的是定义如何初始化数据成员 . 由于派生类从基类继承数据成员,因此派生类的任何构造函数不仅必须定义如何初始化特定于派生类的数据成员,还要定义来自基类的数据成员 .
执行此操作(以及C标准所要求的)的自然方法是调用基类构造函数 . 如果未在派生类构造函数的初始化列表中包含特定构造函数调用,则将使用基类的默认构造函数初始化基类成员 .
上面的示例说明了派生类构造函数如何初始化其成员
_j
,但是来自基类的成员_i
必须使用基类构造函数进行初始化 .按照上面的方式编写,默认构造函数
base::base()
将由编译器自动调用,即_i
将初始化为0 .但是您可以通过包含对特定构造函数的调用来更改该行为:
构造函数调用的顺序是:基类的第一个构造函数调用,然后是派生类特定成员的初始化程序 . 这很自然,因为派生类在某种意义上是基类的扩展,并且有必要将派生类对象的基类部分视为首先存在 .