




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,C+面向对象程序设计,5.5 派生类的构造函数和析构函数,基类的构造函数不被继承,派生类中需要声明自己的构造函数。 在设计派生类的构造函数时候,不仅要考虑派生类所增加的数据成员初始化,也要考虑基类的数据成员初始化。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,需要调用基类构造函数完成。 如果要调用基类带参数的构造函数,派生类的构造函数需为基类的构造函数传递参数。,5.5.1 简单的派生类的构造函数,简单的派生类 只有一个基类 只有一级派生 不包含基类的对象 派生类构造函数名(总参数列表):基类构造函数名(参数列表) 派生类中新增数据成员初始化语句 ;,#include /例5.5 #include using namespace std; class Student public: Student(int n, string nam, char s) num=n; namenam; sex=s; Student() protected: int num; string name; char sex; class Student1:public Student public: Student1(int n, string nam, char s,int a, string ad): Student(n,nam,s) age=a; addrad;,void show() cout“num:“numendl; cout“name:“nameendl; cout“sex:“sexendl; cout“age:“ageendl; cout“address:“addrendl; Student1() private: int age; string addr; ; int main() Student1 stud1(10010,“Wang-li“, f,19,“115 Beijing Road ,Shanghai“); Student1 stud2(10011,“Zhang-fun“, m,21,“213 Shanghai Road,Beijing“); stud1.show(); stud2.show(); return 0;,5.5.1 简单派生类的构造函数,5.5.1 简单的派生类的构造函数,建立一个对象时,执行构造函数的顺序是:派生类构造函数先调用基类的构造函数,再执行派生类构造函数本身(派生类构造函数的函数体)。,5.5.2 有子对象的派生类的构造函数,派生类构造函数的任务: 对基类数据成员初始化 对子对象数据成员初始化 对派生类数据成员初始化,#include /例5.6 #include class Student public: Student(int n, string nam) num=n; name=nam; void display() cout“num:“numendl;cout“name:“nameendl; protected: int num; string name; ;,class Student1:public Student public: Student1(int n, string nam,int n1, string nam1,int a, string ad): Student(n,nam),monitor(n1,nam1) age=a; addr=ad; void show() cout“This student is:“endl; display(); cout“age:“ageendl; cout“address:“addrendl; void show_monitor() coutendl“Class monitor is:“ endl; monitor.display(); private: Student monitor; int age; string addr; ;,int main() Student1 stud1(10010,“Wang-li“, 1001,“Li-sun“,19,“115 Beijing Road,Shanghai“); stud1.show(); stud1.show_monitor(); return 0; ,5.5.2 有子对象的派生类的构造函数,5.5.2 有子对象的派生类的构造函数,派生类构造函数一般形式: 派生类构造函数名(总参数表列):基类构造函数名1(参数表列1),基类构造函数名2(参数表列2),子对象名1(子对象参数1),子对象名2(子对象参数2), 派生类中新增数据成员初始化语句,5.5.2 有子对象的派生类的构造函数,执行派生类构造函数的顺序: 调用基类构造函数,对基类数据成员初始化 调用子对象构造函数,对子对象数据成员初始化 在执行派生类构造函数本身,对派生类数据成员初始化,class Student public: Student(int n, string nam ) num=n; name=nam; void display() cout“num:“numendl; cout“name:“nameendl; protected: int num; string name; class Student1:public Student public: Student1(int n, string nam, int a): Student(n,nam)age=a; void show() display(); cout“age:“ageendl; private: int age;,5.5.3 多层派生时的构造函数,class Student2:public Student1 public: Student2(int n, string nam,int a,int s):Student1(n,nam,a) score=s; void show_all() show(); cout“score:“scoreendl; private: int score; ; int main() Student2 stud(10010,“Li“,17,89); stud.show_all(); return 0; ,5.5.3 多层派生时的构造函数,先初始化基类的数据成员num和name 在初始化Student1的数据成员age 最后再初始化Student2的数据成员score 不要列出每一层派生类的构造函数,只要写出上一层派生类的构造函数即可,5.5.3 多层派生时的构造函数,5.5.4 派生类构造函数的特殊形式,当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空,即构造函数是空函数 如果在基类中没有定义构造函数,或定义了没有参数的构造函数(默认构造函数),在定义派生类构造函数时可以不写基类构造函数。,5.5.4 派生类构造函数的特殊形式,如果在基类和子对象类型的声明中都没定义带有参数的构造函数,而且不需要对派生类自己的数据成员初始化,则可不必显式地定义派生类构造函数。 如果基类或子对象类型的声明中定义了带参数的构造函数,就必须显式地定义派生类构造函数。 如果基类中既定义无参的构造函数,又定义了有参的构造函数,在定义派生类构造函数时,既可以包含基类构造函数及其参数,也可以不包含基类构造函数。,5.5.5 派生类的析构函数,析构函数也不被继承,派生类自行声明。 声明方法与一般(无继承关系时)类的析构函数相同。 不需要显式地调用基类的析构函数,系统会自动隐式调用。 析构函数的调用次序与构造函数相反。,派生类构造、析构函数的执行顺序,编译器调用构造函数的次序: 编译器调用析构函数的次序:,基类,子对象,派生类,基类,子对象,派生类,5.6 多重继承,5.6.1 声明多重继承的方法,class 派生类名 :继承方式1 基类名1, 继承方式2 基类名2, 派生类新增加的成员 ;,5.6.2 多重继承派生类的构造函数,派生类构造函数名(总参数表列):基类构造函数名1(参数表列1),基类构造函数名2(参数表列2),子对象名1(子对象参数1),子对象名2(子对象参数2), 派生类中新增数据成员初始化语句,5.6.2 多重继承派生类的构造函数,构造函数的调用次序 调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。 派生类的构造函数体中的内容。,5.6.2 多重继承派生类的构造函数,#include #include using namespace std; class Teacher public: Teacher(string nam,int a,string t) name=nam; age=a; title=t; void display() cout“name:“nameendl; cout“age“ageendl; cout“title:“titleendl; protected: string name; int age; string title; ;,class Student public: Student(string nam,char s,float sco) name1=nam; sex=s; score=sco; void display1() cout“name:“name1endl; cout“sex:“sexendl; cout“score:“scoreendl; protected: string name1; char sex; float score; ;,5.6.2 多重继承派生类的构造函数,class Graduate:public Teacher,public Student public: Graduate(string nam,int a,char s,string t,float sco,float w): Teacher(nam,a,t),Student(nam,s,sco),wage(w) void show( ) cout“name:“nameendl; cout“age:“ageendl; cout“sex:“sexendl; cout“score:“scoreendl; cout“title:“titleendl; cout“wages:“wageendl; private: float wage; ;,int main( ) Graduate grad1(“Wang-li“,24,f,“assistant“,89.5,1234.5); grad1.show( ); return 0; ,5.6.3 多继承引起的二义性问题,一般说来,在派生类中对基类成员的访问应该是惟一的。但是,由于多继承情况下,可能造成对基类中某个成员的访问出现了不惟一的情况,则称为对基类成员访问的二义性问题。,两个基类有同名成员,多重继承中,如果不同基类中有同名成员,在派生类中就有同名的成员,这种成员会造成二义性。,A类 int a; void display();,B类 int a; void display();,C类 int a; void display(); int a void display(); int b; void show();,两个基类有同名成员,class A public: int a; void display(); ; class B public: int a; void display(); ; class C: public A, public B public: int b; void show(); ;,C c1; c1.a=3; /存在二义形 c1.display(); /存在二义形 可以用基类名来限定: c1.A:a=3; c1.A:display();,两个基类有同名成员,class A public: int a; void display(); ; class B public: int a; void display(); ;,class C: public A, public B public: int b; void show() a=3; /存在二义形 dislpaly(); /存在二义形 ; 可改为: class C: public A, public B public: int b; void show() A:a=3; A:dislpaly(); ,C类 int a; void display(); int a void display(); int b; void show();,C类 int b; int A:a; int B:a; void show(); void A:display(); void B:display();,A,B,C,两个基类有同名成员,基类和派生类有同名成员:派生类成员覆盖基类成员,class C: public A, public B int a; void display()couta“display of c”endl; ; void main() C c1; c1.display(); ,两个基类和派生类都有同名成员,c1.A:display();,A:aB:a,不同的成员函数,只有在函数名和参数个数相同、类型匹配的情况下才发生同名覆盖 如果只有函数名相同,不会发生同名覆盖,而属于函数重载,两个基类和派生类都有同名成员,访问共同基类成员,类A,类B1,类B2,类C,访问共同基类成员,访问共同基类成员,那么怎么通过类C访问类B1从基类A继承下来的成员呢? c1.B1:a=3; c1.a=3;和c1.A:a=3;都不正确 如果要通过类C访问类B2从基类A继承下来的成员 c1.B2:a=3;,class A public: int a; ; class B1:public A public: int b1; ; class B2:public A public: int b2; ; class C: public B1,public B2 public: int fun(); private: int c; ;,int C:fun() int sum(0); sum=a+a; sum=A:a+A:a; sum=B1:a+B2:a; return sum; void main() C c1; c1.a=3; c1.A:a=3; c1.B1:a=3; c1.B2:a=5; ,5.6.4 虚基类,虚基类的作用,当某类的部分或全部直接基类是从另一个共同基类派生而来时,这些直接基类中从上一级基类继承来的成员拥有相同的名称,即,这些同名成员在内存中存在多个副本,虚基类的作用,类C int B1:a; int B2:a; int B1:b1; int B2:b2; int c;,虚基类的作用,多数情况下,只需使用多个副本的任一个。 C+语言允许通过将直接基类的共同基类设置为虚基类,使从不同路径继承过来的该类成员在内存中只拥有一个副本,从而消除二义性问题。 引进虚基类的真正目的是为了解决二义性。 虚基类的说明在派生类的定义中。 class 派生类名:virtual 继承方式 基类名 ,虚基类的作用,class A; class B1: virtual public A ; class B2: virtual public A ; Class C: public B1, public B2 ;,虚基类的作用,类C int a; int B1:b1; int B2:b2; int c;,虚基类的作用,一个基类可以在生成一个派生类时,作为虚基类,而在生成另一个派生类时不作为虚基类。,class A ; class B:virtual public A ; class C:virtual public A ; class D: public A ; class E:public B,public C ;,如果在虚基类中定义了带参数的构造函数,而没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生类)中,通过构造函数的初始化表对虚基类进行初始化。 以前,在派生类的构造函数中只需调用其直接基类的构造函数。,虚基类的初始化,虚基类的初始化,class A A(int i) ; class B:virtual public A B(int n):A(n) ; class C:virtual public A C(int n):A(n) ;,class D: public A D(int n):A(n) ; class E:public B,public C E(int n):A(n),B(n),C(n) ;,#include class A public: A(int pa) a=pa; cout“A(int):“aendl; private: int a; ; class B1:virtual A public: B1(int pa,int pb1):A(pa) b1=pb1; cout“B1(int,int):”b1endl; private:int b1; ;,虚基类的初始化,class B2:virtual A public: B2(int pa, int pb2):A(pa) b2=pb2; cout“B2(int,int):“b2endl; private: int b2; ; class C:public B1, public B2 public: C(int p1, int p2, int p3, int p4):B1(p1, p2), B2(p2, p3),A(p3) c=p4; cout“C(int, int, int, int):“cendl; private: int c; ; void main() C c1(1,2,3,4); ,虚函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教部编版 (五四制)5 草船借箭教学设计
- 九年级语文上册 第五单元 20 香菱学诗教学设计 (新版)新人教版
- 人教A版 (2019)必修 第二册7.3 复数的三角表示教学设计及反思
- 人教部编版九年级下册十五从军征教案及反思
- 二年级上册美术教学设计-17 纸线绳小浮雕-苏少版
- 安装设备安全培训
- 优化班级小组建设的16个策略
- 人教部编版17 难忘的泼水节教学设计及反思
- 人教版七年级上册第二单元 第一课大洲和大洋教学设计6
- 2024云南省有色地质局三0八队下属企业招聘24人笔试参考题库附带答案详解
- 【9数一模】2025年安徽省合肥市蜀山区九年级中考一模数学试卷(含答案)
- 2025年无锡市锡山环保能源集团招聘笔试参考题库含答案解析
- 田径运动会各种记录表格
- 高速铁路知识PPT通用PPT课件
- 2019最新中小学校安全管理制度汇编
- 内审不符合项报告
- 铝合金门窗工程监理质量控制图册
- MyPowerS3100系列以太网交换机配置手册V4.0
- 吹灰器检修三措两案
- 点击下载视力残疾标准和评定方法(马胜生) - 广州市残疾人联合会
- ROHS等有害物质削减计划
评论
0/150
提交评论