OOP(面向对象的程序设计)中最有特点、最有魅力的地方莫过于类和对象,虽然在我们使用过程中经常找不到对象,但whatever,OOP的诞生始终是整个代码届的里程碑!今天我们给大家解读下OOP中派生类(子类)的构造函数与基类(父类)构造函数的调用顺序,以及参数列表和类成员的初始化顺序。
面向对象的程序设计派生类构造函数调用顺序
我们众所周知的构造函数执行秩序基本原则如下:
调用基类构造函数,调用顺序与当前类声明时的基类顺序一致
调用内嵌对象成员的构造函数,顺序与在当前类中声明的顺序一致
代表性代码,以C++为例
示例代码上述代码的运行结果如下:
声明派生类对象时首先调用基类构造函数,调用顺序与派生类声明时继承的基类顺序一致。
类的内嵌对象成员初始化时调用的构造函数顺序与对象成员在类中声明的顺序一致。
那么按照上述的调用原则,就很容易理解示例代码的打印结果了:
派生类Ason声明时继承的基类顺序为:classAson:publicA2,publicA1,publicA3,所以构造Ason的对象时,调用的基类构造顺序为:A2-A1-A3。由于Ason的初始化列表中Ason(inta,intb,intc,intd):A1(a),memberA2(d),memberA1(c),A2(b),分别把a,b传给了A1,A2,因此Ason对象初始化时调用的基类构造函数打印结果如下:
a2=2CallA2构造函数a1=1CallA1构造函数CallA3构造函数
2.类的内嵌对象成员在类初始化时同样需要初始化,这些对象初始化时调用的构造函数顺序与其在类中声明的顺序一致,即Ason中声明的对象成员顺序为:
A1memberA1;A2memberA2;A3memberA3;
故在调用构造函数时,顺序为:A1-A2-A3,构造函数的初值由Ason的初始化列表Ason(inta,intb,intc,intd):A1(a),memberA2(d),memberA1(c),A2(b)传入,因此打印的的结果为:
a1=3CallA1构造函数a2=4CallA2构造函数CallA3构造函数
总结
当一个派生类继承基类时,并且派生类自身包含有其他类的成员对象时,构造函数的调用顺序为:
调用基类的构造函数-调用成员对象的构造函数-调用自身的构造函数
派生类的基类与自身对象成员的构造函数调用顺序与派生类构造函数初始化列表中的构造函数顺序无关,与基类的声明顺序和成员对象在派生类中的声明顺序一致