(5.3)--第5章继承 - (03)_派生类的构造和析构的函数.ppt
面向对象程序设计1第5章 继 承2派生类的构造函数与析构函数派生类的构造函数与析构函数01.派生的构造函数派生的构造函数02.派生类的析构函数派生类的析构函数03.构造和析构的调用次序构造和析构的调用次序3第章继承派生类的构造函数与析构函数l派生类中需要声明自己的构造函数。派生类中需要声明自己的构造函数。l声明构造函数时,只需要对本类中新增成员进行初始化,对声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。继承来的基类成员的初始化,自动调用基类构造函数完成。l派生类的构造函数需要给基类的构造函数传递参数派生类的构造函数需要给基类的构造函数传递参数1、派生类的构造函数、派生类的构造函数2、派生类构造函数的定义、派生类构造函数的定义 派生类名派生类名(参数参数总表总表):基类名基类名1(参数表参数表1),基类名基类名m(参数表参数表m),成员对成员对象名象名1(成员对象参数表成员对象参数表1),成员对象名成员对象名n(成员对象参成员对象参数表数表n)派生类派生类新增成员新增成员的初始化;的初始化;基类成员的基类成员的初始化表初始化表3、派生类构造函数调用规则、派生类构造函数调用规则单继承时,派生类构造函数调用的单继承时,派生类构造函数调用的一般次序如下:一般次序如下:(1)调用基类构造函数。调用基类构造函数。(2)调用内嵌成员对象的构造函数,调用内嵌成员对象的构造函数,调用顺序取决于它们在类中定义调用顺序取决于它们在类中定义的顺序。的顺序。(3)派生类自己的构造函数。派生类自己的构造函数。派生类构造函数的派生类构造函数的总参数总参数表中定义的参数个数等于表中定义的参数个数等于基类中基类中构造函数参数的个构造函数参数的个数数和和派生类中新增数据成派生类中新增数据成员的个数之和员的个数之和,新增成员,新增成员包括普通数据成员和子对包括普通数据成员和子对象数据成员。象数据成员。4【例【例5-5】单继承机制下构造函数的调用顺序。】单继承机制下构造函数的调用顺序。#include using namespace std;class Baseclass public:Baseclass(int i)a=i;coutconstructing Baseclass a=aendl;private:int a;class Derivedclass:public Baseclass public:Derivedclass(int i,int j);private:int b;Derivedclass:Derivedclass(int i,int j):Baseclass(i)b=j;coutconstructing Derivedclass b=bendl;int main()Derivedclass x(5,6);return 0;constructing Baseclass a=5constructing Derivedclass b=6程序输出结果为:程序输出结果为:第章继承派生类的构造函数与析构函数5当一个类既是派生类同时又包含嵌入对象时,构造函数调用次序:当一个类既是派生类同时又包含嵌入对象时,构造函数调用次序:调用基类的构造函数调用基类的构造函数按类声明中嵌入对象出现的次序调用嵌入对象的构造函数按类声明中嵌入对象出现的次序调用嵌入对象的构造函数执行派生类的构造函数执行派生类的构造函数通过初始化列表向嵌入对象的构造函数传递参数。通过初始化列表向嵌入对象的构造函数传递参数。组合的概念:一个组合的概念:一个类中的数据成员包含另一个类的对象类中的数据成员包含另一个类的对象。第章继承派生类的构造函数与析构函数.组合组合6【例【例5-6】包括派生类新增的数据中有成员】包括派生类新增的数据中有成员对象对象时,其构造函数的调用顺序。时,其构造函数的调用顺序。#include using namespace std;class Base1/基类基类 public:Base1(int i)a=i;coutconstructing Base1 a=aendl;private:int a;class Base2 public:Base2(int i)b=i;coutconstructing Base2 b=bendl;private:int b;class Base3 public:Base3(int i)c=i;coutconstructing Base3 c=cendl;private:int c;class Derivedclass:public Base1 public:Derivedclass(int i,int j,int k,int m);private:int d;Base2 f;Base3 g;第章继承派生类的构造函数与析构函数7Derivedclass:Derivedclass(int i,int j,int k,int m):Base1(i),g(j),f(k)d=m;coutconstructing Derivedclass d=dendl;int main()Derivedclass x(5,6,7,8);return 0;constructing Base1 a=5constructing Base2 b=7constructing Base3 c=6constructing Derivedclass d=8Press any key to continue注意:注意:成员对象成员对象f和和g的调用顺序取决于它们有的调用顺序取决于它们有派生类中被声明的顺序,与它们在成员初始化列派生类中被声明的顺序,与它们在成员初始化列表中的顺序无关。表中的顺序无关。程序运行结果:程序运行结果:第章继承派生类的构造函数与析构函数85.派生类析构函数派生类析构函数派生类的析构函数的功能是在该类对象消亡之前派生类的析构函数的功能是在该类对象消亡之前进行一些必要的清理工作。进行一些必要的清理工作。l析构函数也不被继承,派生类自行声明析构函数也不被继承,派生类自行声明l声明方法与一般(无继承关系时)类的析构函数声明方法与一般(无继承关系时)类的析构函数相同。相同。l不需要显式地调用基类的析构函数,系统会自动不需要显式地调用基类的析构函数,系统会自动隐式调用。隐式调用。l析构函数的调用次序与构造函数相反。析构函数的调用次序与构造函数相反。(1)首先调用派生类的析构函数首先调用派生类的析构函数(清理派生清理派生类新增成员类新增成员);(2)如果派生类中有成员对象,再调用派生如果派生类中有成员对象,再调用派生类中成员对象所在类的析构函数(清理派类中成员对象所在类的析构函数(清理派生类新增的成员对象);生类新增的成员对象);(3)再调用普通基类的析构函数再调用普通基类的析构函数(清理从基清理从基类继承来的基类对象类继承来的基类对象);(4)最后调用虚基类的析构函数。(虚基类最后调用虚基类的析构函数。(虚基类的知识在后面讲解)的知识在后面讲解)析构函数调用规则如下:析构函数调用规则如下:析构析构函数执行顺序和构造函数正好相反函数执行顺序和构造函数正好相反先自己(派生类本身)再客人(内嵌对象)后祖先(基类)。回想回想一下构造函数的调用次序一下构造函数的调用次序?第章继承派生类的构造函数与析构函数9【例5-8】派生类析构函数的调用顺序。#include using namespace std;class Base1/基类 public:Base1(int i)a=i;cout“constructing Base1 a=”aendl;Base1()coutdestructing Base1endl;private:int a;class Base2/基类Base2 public:Base2(int i)/构造函数 b=i;coutconstructing Base2 b=bendl;Base2()/析构函数 coutdestructing Base2endl;private:int b;第章继承派生类的构造函数与析构函数录屏105-4.mp4class Base3/子对象f所属类 public:Base3(int i)/构造函数 c=i;coutconstructing Base3 c=cendl;Base3()/析构函数 coutdestructing Base3endl;private:int c;class Base4/子对象g所属类 public:Base4(int i)/构造函数 d=i;coutconstructing Base4 d=dendl;Base4()/析构函数 coutdestructing Base4endl;private:int d;第章继承派生类的构造函数与析构函数录屏115-4.mp4class Derivedclass:public Base1,public Base2 public:Derivedclass(int i,int j,int k,int m,int n);Derivedclass();private:int e;Base3 f;Base4 g;Derivedclass:Derivedclass(int i,int j,int k,int m,int n):Base1(i),Base2(j),f(k),g(m)e=n;coutconstructing Derivedclass e=eendl;Derivedclass:Derivedclass()/派生类析构函数派生类析构函数 coutdestructing Derivedclassendl;contructing Base1 a=5contructing Base2 b=6contructing Base3 c=7contructing Base4 d=8contructing Derivedclass e=9destructing Derivedclass destructing Base4destructing Base3destructing Base2destructing Base1第章继承派生类的构造函数与析构函数int main()Derivedclass x(5,6,7,8,9);return 0;录屏125-4.mp4本小节结束谢谢谢谢大大家家13