10.5.2 派生类的析构函数

    当对象被删除时,派生类的析构函数被执行。析构函数同样不能继承,因此,在执行派生类析构函数时,基类析构函数会被自动调用。

    执行顺序是先执行派生类的析构函数,再执行基类的析构函数,这和执行构造函数时的顺序正好相反,代码10.6对代码10.5进行了扩充。

    代码10.6 派生类的析构函数DerivedDestructor


    <———————————文件名:example1006.cpp———————————————-> 01 #include<iostream> 02 using namespace std; 03 class A//类A的定义 04 { 05 private://private成员列表 06 int x; 07 public://public成员列表 08 A(int xp=0)//构造函数,带默认参数 09 { 10 x=xp; 11 cout<<"A的构造函数被执行"<<endl; 12 } 13 ~A()//析构函数 14 { 15 cout<<"A的析构函数被执行"<<endl; 16 } 17 }; 18 class B//类B的定义 19 { 20 public://public成员列表 21 B()//无参构造函数 22 { 23 cout<<"B的构造函数被执行"<<endl; 24 } 25 ~B()//析构函数 26 { 27 cout<<"B的析构函数被执行"<<endl; 28 } 29 }; 30 class C:public A//类C由类A派生而来 31 { 32 private: 33 int y; 34 B b;//对象成员 35 public: 36 37 C(int xp,int yp):A(xp),b()//派生类的构造函数,基类和对象成员都在初始化表中完成初始化 38 { 39 y=yp; 40 cout<<"C的构造函数被执行"<<endl; 41 } 42 ~C()//析构函数 43 { 44 cout<<"C的析构函数被执行"<<endl; 45 } 46 }; 47 int main() 48 { 49 C expC(1,2);//声明一个类C对象expC 50 return 0;//main函数执行完毕,expC撤销,析构函数触发执行 51 }

    输出结果如下所示。

    A的构造函数被执行

    B的构造函数被执行

    C的构造函数被执行

    C的析构函数被执行

    B的析构函数被执行

    A的析构函数被执行

    【代码解析】代码第30行,说明类C是由类A派生而来的,而整个代码的输出结果体现了派生类析构函数的执行顺序,代码直观简洁,没有需要特别说明的地方。