:::info 派生类的对象包含多个子对象:

  • 由基类构造函数初始化的基类子对象
  • 派生类自己构造函数初始化的派生类子对象

这些对象要分别由对应的constructor赋值 :::

构造函数

派生类的constructor不仅要为派生类子对象赋值,还要对基类的data member进行传值;

  1. inline Fibonacci::
  2. Fibonacci(int len, int beg_pos):num_sequence(len, beg_pos, _elems){}

:::tips

  • 这里就是用member initialization list的方式来赋值;
  • 基类成员和子对象成员初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行 :::

  • 如忽略了调用基类的那么会:

    • 报错,因为没有为指出基类的对象怎么赋值
    • 若基类定义了默认的构造函数,那么会调用默认构造函数;

类似的拷贝构造函数也是相似的,需要对基类对应的拷贝构造函数也赋值
Copy assignment operator也是一样;

几种情况

  • 基类有默认构造函数,派生类未显示调用时,派生类自动调用基类的默认构造函数;
  • 基类有默认构造函数,派生类显示调用时,派生类自动调用基类的默认构造函数;
  • 基类没有默认构造函数,派生类显示调用时,派生类会调用系统为基类生成的默认构造函数;
  • 基类没有默认构造函数,派生类未基类有带参数的构造函数,也有默认构造函数,派生类未显示调用基类构造函数时,派生类会调用基类默认构造函数;显示调用时,派生类会调用系统为基类生成的默认构造函数;
  • 基类有带参数的构造函数,也有默认构造函数,派生类显示调用基类一种构造函数时,派生类会调用基类该种构造函数
  • 基类仅写了带参数的构造函数,没写不带参数的默认构造函数时,而派生类又没有显示调用基类构造函数时,编译失败。因为基类写了构造函数,系统就不会为基类生成默认构造函数,派生类想调用基类的默认构造函数时找不到;

派生类调用基类的构造函数方式一览

小结

  • 派生类的构造,拷贝初始化,拷贝赋值都是需要对基类中相关的成员函数进行赋值(传输数据)
  • 因为存在有默认的构造、拷贝等,所以在有些时候不需要进行显式的赋值,但是一般需要?