设有3个类A、B、C,其中A派生B,B派生C。
即:C-> B-> A
定义一个C对象,则:
① 进入C对象的构造函数
② 检查C构造函数的初始化列表,看其中是否手动调用基类B构造函数。无论是否手动,都立即调用基类B构造函数。不同的是手动调用时,可以为B构造函数传参
③ 进入B构造函数
④ 检查B构造函数的初始化列表,看其中是否手动调用基类A构造函数
⑤ 进入A构造函数
⑥ 检查A构造函数的初始化列表,发现没有手动调用父类构造函数。并且发现A没有父类。于是此时开始执行A的构造函数
⑦ A构造函数执行完毕,返回B构造函数,开始执行B的构造函数
⑧ B构造函数执行完毕,返回C构造函数,开始执行C的构造函数
⑨ C构造函数执行完毕,整个构造过程完毕
由上可知,调用派生类构造函数时,先进入派生类构造函数,但是并不调用,接着立即进入其父类构造函数,同样并不调用,在进入其父类构造函数……直到根基类没有父类了,那么执行其构造函数,然后层层返回,依次执行子类构造函数。
即:子类构造函数最先进入,但最后执行。
注意②中手动调用父类构造函数时,可以为父类构造函数传参。虽然无论是否手动调用,都是会先调用父类构造函数,但是若要为父类构造函数传参,只能通过初始化列表显式调用并传参。
如:
C:C()
:B(9)
,m_kC(0)
{
}
B:B(intbValue)
:m_kB(bValue)
{
}
执行时:
① 先进入C的构造函数,发现其初始化列表显式调用了B的构造函数,并为其传入了一个参数9,于是进入B的构造函数
② 进入B的构造函数,发现其初始化列表并没有显示调用父类构造函数,但其有父类A,于是进入A的构造函数
③ 进入A的构造函数,发现其没有父类,于是执行A的构造函数
④ 返回B的构造函数,开始执行,根据传入的值9,为其成员变量m_kB赋值为9
⑤ 返回C的构造函数,开始执行,将其成员变量m_kC赋值为0
结束。