首页 理论教育C++派生类析构函数

C++派生类析构函数

【摘要】:和构造函数一样,析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用,其顺序与执行构造函数时的顺序正好相反。最后调用基类的析构函数,多个基类则按派生类声明时列出的逆序、从右到左调用,而不是初始化列表中的次序。首先执行派生类的析构函数,然后执行派生类成员对象的析构函数,再执行基类的析构函数,最后执行基类成员对象的析构函数。

和构造函数一样,析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用,其顺序与执行构造函数时的顺序正好相反。派生类析构函数执行的一般次序如下:

(1)最先执行派生类的析构函数。

(2)再次调用对象成员(子对象)的析造函数,按类声明中对象成员出现的逆序调用,而不是初始化列表中的次序。

(3)最后调用基类的析构函数,多个基类则按派生类声明时列出的逆序、从右到左调用,而不是初始化列表中的次序。

【例6.8】分析以下程序的执行结果。

解:上述程序中,由基类A公有派生类B(属单继承的情况),所以对于语句“B b”定义的对象b,先执行基类A的构造函数,再执行类B的构造函数。在释放对象b时,先执行类B的析构函数,再执行类A的析构函数。程序的执行结果如下:

A Constructor

B Constructor

B Destructor

A Destructor(www.chuimin.cn)

若基类和派生类都包含其他类的对象,在创建派生类的对象时,析构函数是按照对应的构造函数调用的相反顺序来调用的。首先执行派生类的析构函数,然后执行派生类成员对象的析构函数,再执行基类的析构函数,最后执行基类成员对象的析构函数。

【例6.9】分析以下程序的执行结果。

解:上述程序中,由类C派生出类D(属单继承的情况),但类C中包含一个类A的对象a,类D中包含一个类B的对象b,对应的类层次如图6.9所示。所以,对于main()函数中的语句D d,先执行类D中的析构函数,再执行类D中对象的析构函数,接着是基类C的析构函数,最后执行类C中对象的析构函数。程序执行结果如下:

classs D

classs B

classs C

classs A

图6.9 类层次图