《第4章 继承与派生(3).ppt》由会员分享,可在线阅读,更多相关《第4章 继承与派生(3).ppt(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+面向对象程序设计面向对象程序设计第第4章章 继承和派生继承和派生2目目 标标q理解派生和继承的相关概念;理解派生和继承的相关概念;q掌握派生类的声明方式掌握派生类的声明方式q掌握派生类的构成和成员的访问属性;掌握派生类的构成和成员的访问属性;q掌握派生类构造函数和析构函数的使用方掌握派生类构造函数和析构函数的使用方法;法;q掌握多重继承的方法;掌握多重继承的方法;q理解虚基类的作用和声明方式。理解虚基类的作用和声明方式。3本章内容本章内容p4.1 基类和派生类基类和派生类p4.2 单继承单继承p4.3 多继承多继承p4.4 虚基类虚基类p4.5 综合案例分析综合案例分析44.3 多继承多继
2、承q多继承:多继承:一个派生类同时继承多个基类。一个派生类同时继承多个基类。人人学生学生老师老师大学生大学生研究生研究生硕士硕士生生博士博士生生专科专科生生本科本科生生在职研究生在职研究生54.3 多继承多继承p4.3.1 声明多继承的方法声明多继承的方法p4.3.2 多继承下的构造函数多继承下的构造函数p4.3.3 多继承引起的二义性问题多继承引起的二义性问题64.3.1 声明多继承的方法声明多继承的方法n声明格式声明格式 class 派生类名派生类名:继承方式继承方式基类名基类名1,继承方式继承方式基类名基类名2,.,继承方式继承方式基类名基类名n 派生类成员声明;派生类成员声明;n例例7
3、class Apublic:displayA couta;private:int a;class B public:displayB coutb;private:int b;class C:public A,public B public:displayC coutc;private:int c;8Cint a;int b;int c;void DisplayA();void DisplayB();void DisplayC();Aint a;void DisplayA();Bint b;void DisplayB();4.3.1 声明多继承的方法声明多继承的方法94.3 多继承多继承p4.3
4、.1 声明多继承的方法声明多继承的方法p4.3.2 多继承下的构造函数多继承下的构造函数p4.3.3 多继承引起的二义性问题多继承引起的二义性问题104.3.2 多继承下的构造函数多继承下的构造函数q多继承下的构造函数和析构函数与单继承多继承下的构造函数和析构函数与单继承下的构造函数和析构函数相似。下的构造函数和析构函数相似。q派生类的构造函数需要对派生类的构造函数需要对基类成员、内嵌基类成员、内嵌子对象子对象和和新增成员新增成员进行初始化。进行初始化。q例:例:11class A public:A(int aa=0)a=aa;private:int a;class B public:B(in
5、t bb=0)b=bb;private:int b;class C:public A,public B public:private:A x;B y;int c;构造函数构造函数C(int a1,int a2,int b1,int b2,int cc):A(a1),x(a2),B(b1),y(b2)c=cc;124.3.2 多继承下的构造函数多继承下的构造函数q派生类的构造函数需要对基类成员、内嵌派生类的构造函数需要对基类成员、内嵌子对象和新增成员进行初始化。子对象和新增成员进行初始化。q基类构造函数的调用顺序基类构造函数的调用顺序按声明派生类时按声明派生类时基类出现的顺序基类出现的顺序,与构
6、造函数中出现顺序,与构造函数中出现顺序无关。无关。子对象子对象也一样,与定义顺序有关。也一样,与定义顺序有关。q例例113class B1 public:B1(int i)coutB1 iendl;class B2 public:B2(int j)coutB2 jendl;class B3 public:B3()coutB3*endl;class C:public B2,public B1,public B3public:C(int a,int b,int c,int d):B1(a),memB2(d),memB1(c),B2(b)private:B1 memB1;B2 memB2;B3 me
7、mB3;void main()C obj(1,2,3,4);144.3.2 多继承下的构造函数多继承下的构造函数q派生类的构造函数需要对基类成员、内嵌派生类的构造函数需要对基类成员、内嵌子对象和新增成员进行初始化。子对象和新增成员进行初始化。q基类构造函数的调用顺序基类构造函数的调用顺序按声明派生类时按声明派生类时基类出现的顺序基类出现的顺序,与构造函数中出现顺序,与构造函数中出现顺序无关。无关。子对象子对象也一样,与定义顺序有关。也一样,与定义顺序有关。q例例2:P272 例例10.10154.3 多继承多继承p4.3.1 声明多继承的方法声明多继承的方法p4.3.2 多继承下的构造函数多继
8、承下的构造函数p4.3.3 多继承引起的二义性问题多继承引起的二义性问题164.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员;、两个基类有同名成员;2 2、两个基类和派生类三者都有同名成员;、两个基类和派生类三者都有同名成员;3 3、两个派生类从同一个基类派生。、两个派生类从同一个基类派生。174.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者
9、都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生184.3.3 多继承引起的二义性问题多继承引起的二义性问题1、两个基类有同名成员、两个基类有同名成员Avoid display();Bvoid display();Cvoid A:display();void B:display();C c;c.display();C c;c.A:display();c.B:display();194.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 解决方法:引用时指定同名成员所属
10、类。解决方法:引用时指定同名成员所属类。2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生204.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生21class A public:void display()coutAendl;class B public:void d
11、isplay()coutBendl;class C:public A,public B public:void display()cout“Cendl;void main()C c;c.display();4.3.3 多继承引起的二义性问题多继承引起的二义性问题224.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员l派生类同名成员将覆盖基类中的同名成员。l不同的成员函数只有在完全相同的情况下才发生同名覆盖,如果函数名
12、相同而参数不同,属于函数重载。3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生234.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员l派生类同名成员将覆盖基类中的同名成员。l不同的成员函数只有在完全相同的情况下才发生同名覆盖,如果函数名相同而参数不同,属于函数重载。3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生C c;c.display();/访问访问C类的类的display()c.A:
13、display();/访问访问A类的类的display()c.B:display();/访问访问B类的类的display()244.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 解决方法:基类同名成员被派生类的同名成解决方法:基类同名成员被派生类的同名成员覆盖。如果想访问基类同名成员,加类名。员覆盖。如果想访问基类同名成员,加类名。3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生254.3.3 多继承
14、引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生26class A public:void display()coutaendl;class B:public A ;class C:public A ;class D:public B,public C public:void display()coutaendl;void main()D d;d.display();/
15、D类的类的display()c.B:display();/B类从类从A类继承的类继承的display()c.C:display();/C类从类从A类继承的类继承的display()274.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生 在派生类中引用时指明是从哪个直接基类继在派生类中引用时指明是从哪个直接基类继承的,加直接基类名。会保存共同基类的多份同承
16、的,加直接基类名。会保存共同基类的多份同名成员。名成员。284.3.3 多继承引起的二义性问题多继承引起的二义性问题Aint a;void display();Eint B:a;int C:a;int D:a;void B:display();void C:display();void D:display();Bint A:a;void A:display();Dint A:a;void A:display();Cint A:a;void A:display();E中能否只保中能否只保留一份留一份A的的a和和display()?294.3.3 多继承引起的二义性问题多继承引起的二义性问题n多重
17、继承引起的二义性问题多重继承引起的二义性问题 1 1、两个基类有同名成员、两个基类有同名成员 2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生n例:例:P278 P278 例例10.1310.1330本章内容本章内容p4.1 基类和派生类基类和派生类p4.2 单继承单继承p4.3 多继承多继承p4.4 虚基类虚基类p4.5 综合案例分析综合案例分析314.3 多继承多继承q练习题:练习题:P289 10.9题题 10.12题题 10.10题题32n如何声明多继承;如何声明多继承;n如何定义多继承派生类的构造函数;如何定义多继承派生类的构造函数;n多继承方式下的二义性问题:多继承方式下的二义性问题:1 1、两个基类有同名成员;、两个基类有同名成员;2 2、两个基类和派生类三者都有同名成员、两个基类和派生类三者都有同名成员 3 3、两个派生类从同一个基类派生、两个派生类从同一个基类派生4.3 多继承多继承33
限制150内