:::info 派生类的对象包含多个子对象:
- 由基类构造函数初始化的基类子对象
- 派生类自己构造函数初始化的派生类子对象
构造函数
派生类的constructor不仅要为派生类子对象赋值,还要对基类的data member进行传值;
inline Fibonacci::
Fibonacci(int len, int beg_pos):num_sequence(len, beg_pos, _elems){}
:::tips
- 这里就是用member initialization list的方式来赋值;
对基类成员和子对象成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行 :::
如忽略了调用基类的那么会:
- 报错,因为没有为指出基类的对象怎么赋值
- 若基类定义了默认的构造函数,那么会调用默认构造函数;
类似的拷贝构造函数也是相似的,需要对基类对应的拷贝构造函数也赋值
Copy assignment operator也是一样;
几种情况
- 基类有默认构造函数,派生类未显示调用时,派生类自动调用基类的默认构造函数;
- 基类有默认构造函数,派生类显示调用时,派生类自动调用基类的默认构造函数;
- 基类没有默认构造函数,派生类显示调用时,派生类会调用系统为基类生成的默认构造函数;
- 基类没有默认构造函数,派生类未基类有带参数的构造函数,也有默认构造函数,派生类未显示调用基类构造函数时,派生类会调用基类默认构造函数;显示调用时,派生类会调用系统为基类生成的默认构造函数;
- 基类有带参数的构造函数,也有默认构造函数,派生类显示调用基类一种构造函数时,派生类会调用基类该种构造函数
- 基类仅写了带参数的构造函数,没写不带参数的默认构造函数时,而派生类又没有显示调用基类构造函数时,编译失败。因为基类写了构造函数,系统就不会为基类生成默认构造函数,派生类想调用基类的默认构造函数时找不到;
小结
- 派生类的构造,拷贝初始化,拷贝赋值都是需要对基类中相关的成员函数进行赋值(传输数据)
- 因为存在有默认的构造、拷贝等,所以在有些时候不需要进行显式的赋值,但是一般需要?