类的继承与多态性课件.ppt
《类的继承与多态性课件.ppt》由会员分享,可在线阅读,更多相关《类的继承与多态性课件.ppt(60页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、类的继承与多态性第1页,此课件共60页哦本章内容本章内容类的继承类的继承类的虚函数与多态性类的虚函数与多态性类的静态成员类的静态成员类模板类模板第2页,此课件共60页哦一、继承的概念一、继承的概念继承是软件重用的一种方式。继承是软件重用的一种方式。通过继承建立新类的优越性通过继承建立新类的优越性:通过重用已有代码,提高编程效率,降低软件开发成本;通过重用已有代码,提高编程效率,降低软件开发成本;更有效地保持共有特性的一致性;更有效地保持共有特性的一致性;提高了系统的可维护性;提高了系统的可维护性;是实现多态性的基础。是实现多态性的基础。被继承的类称为被继承的类称为 “父类父类”或或 “基类基类
2、”;继承者被称为继承者被称为 “子类子类”或或 “派生类派生类”;9.1 9.1 类的继承类的继承第3页,此课件共60页哦继承体现了类的继承体现了类的“层次层次”,从层次上来说,从层次上来说,就是位于上层的是基类就是位于上层的是基类,下层的为派生类下层的为派生类;派生类吸收了基类的非派生类吸收了基类的非privateprivate成员,并增成员,并增添新的性能。添新的性能。基类、派生类是相对的。基类、派生类是相对的。第4页,此课件共60页哦基类与派生类示例基类与派生类示例基类基类派生类派生类学生学生本科生本科生,研究生研究生形状形状圆圆,三角形三角形,矩形矩形,球体球体,立方体立方体贷款贷款汽
3、车贷款汽车贷款,住房贷款住房贷款,抵押贷款抵押贷款雇员雇员教职员工教职员工,后勤人员后勤人员账户账户支票账户支票账户,储蓄账户储蓄账户一般地一般地,派生类的对象都派生类的对象都 “是是”其基类的一个对象其基类的一个对象;基类所能基类所能表示的对象集合比派生类所表示的对象集合大表示的对象集合比派生类所表示的对象集合大.eg.eg.矩形类矩形类“是是”四边形类四边形类,反之不成立反之不成立.第5页,此课件共60页哦单继承单继承建筑物建筑物房屋房屋桥梁桥梁纪念塔纪念塔平房平房楼房楼房居民楼居民楼办公楼办公楼单继承单继承:派生类仅由派生类仅由一个一个基类派生而来基类派生而来第6页,此课件共60页哦多继
4、承多继承EmployeeFacultyStaff Administrator Teacher Administrator teacher多重继承多重继承:派生类由多于一个派生类由多于一个的基类派生而成的基类派生而成多级继承多级继承:等于或多于两个等于或多于两个的继承层次的继承层次第7页,此课件共60页哦二、派生类的定义二、派生类的定义定义格式:定义格式:class :派生类新定义成员派生类新定义成员;继承方式包括:继承方式包括:public/protected/private 分别表示派生类分别表示派生类公有公有继承基类,继承基类,派生类派生类保护保护继承基类,继承基类,派生类派生类私有私有继
5、承基类继承基类class A pulbic:A(int aa=0)a=aa;void showA();private:int a;class B:public A public:B(int bb=0)b=bb;private:int b;第8页,此课件共60页哦聚合聚合VS继承继承聚合:聚合:B类对象的成员类对象的成员包括包括A类的一个或多个类的一个或多个对象。对象。继承:继承:B类对象的成员类对象的成员包括包括A类的成员。类的成员。class A pulbic:A(int aa=0)a=aa;void showA();private:int a;class B:public A public
6、:B(int bb=0)b=bb;private:int b;class A pulbic:A(int aa=0)a=aa;void showA();private:int a;class B public:B(int bb=0):aa(0)b=bb;private:int b;A aa;;B-b:int+showA(),+B()B-b:int,-aa:A+B()第9页,此课件共60页哦派派生生类类成成员员的的构构成成后举例基类基类中的中的私有私有成员成员不能不能被派被派生类生类成员成员直接直接引用。引用。派生类对象先存储其基类子对象部分,再存储新增部分。派生类对象先存储其基类子对象部分,再存
7、储新增部分。第10页,此课件共60页哦派生类成员和外部对象访问基类中的私有成员派生类成员和外部对象访问基类中的私有成员派生类专属成员使用基类私有成员的方式:派生类专属成员使用基类私有成员的方式:不能直接使用基类中的私有成员;不能直接使用基类中的私有成员;成员函数方式:派生类成员函数成员函数方式:派生类成员函数需要通过基类提供的需要通过基类提供的公公有或保护有或保护成员函数间接访问成员函数间接访问;外部对象通过基类的外部对象通过基类的公有成公有成员函数员函数使用其私有成员;使用其私有成员;友元方式:友元方式:把派生类定义为基类的友元,则派生类成员把派生类定义为基类的友元,则派生类成员可以可以直接
8、使用直接使用基类成员;而派生类对象则可以基类成员;而派生类对象则可以用友元用友元函数间接使用函数间接使用基类私有成员基类私有成员第11页,此课件共60页哦派生类的三种继承方式派生类的三种继承方式公有继承:公有继承:除基类的私有成员继续为基类的私有成员外,基除基类的私有成员继续为基类的私有成员外,基类的公有成员和保护成员分别成为派生类的公有成员类的公有成员和保护成员分别成为派生类的公有成员和保护成员。和保护成员。私有继承:私有继承:除基类的私有成员继续为基类的私有成员外,基除基类的私有成员继续为基类的私有成员外,基类的公有成员和保护成员将成为派生类的私有成员。类的公有成员和保护成员将成为派生类的
9、私有成员。保护继承:保护继承:除基类的私有成员继续为基类的私有成员外,除基类的私有成员继续为基类的私有成员外,基类的公有成员和保护成员将成为派生类的保护成基类的公有成员和保护成员将成为派生类的保护成员。员。第12页,此课件共60页哦 继承方式继承方式基类成员基类成员publicpublic方式方式派生类内派生类内/类外对象类外对象privateprivate方式方式派生类内派生类内/类外对象类外对象protectedprotected方式方式派生类内派生类内/类外对象类外对象privateprivate不可见不可见不可见不可见不可见不可见protectedprotected可见可见/不可见不可
10、见可见可见/不可见不可见可见可见 /不可见不可见publicpublic可见可见可见可见/不可见不可见 可见可见 /不可见不可见三种继承方式存取权限的关系三种继承方式存取权限的关系类内:指派生类内的成员函数类内:指派生类内的成员函数类外:指类外部定义的派生类对象类外:指类外部定义的派生类对象可见:即可以可见:即可以直接访问直接访问(使用)(使用)不可见:只能不可见:只能间接访问间接访问第13页,此课件共60页哦继承成员的访问属性继承成员的访问属性-举例举例示例 class X private:int a;protected:int b;public:int c;class Y1:public
11、X int d;public:output()return d;Y1的构成的构成-私有:私有:d 保护:保护:b 公有:公有:output(),c不可直接访问:不可直接访问:a(仍属于基类仍属于基类)第14页,此课件共60页哦继承成员的访问属性继承成员的访问属性-举例举例示例class Xprivate:int a;protected:int b;public:int c;class Y2:protected X int d;public:output()return d;Y2的构成的构成-私有:私有:d 保护:保护:b c 公有:公有:output()不可直接访问:不可直接访问:a(仍属于基
12、类仍属于基类)第15页,此课件共60页哦继承成员的访问属性继承成员的访问属性-举例举例示例class Xprivate:int a;protected:int b;public:int c;class Y:private X int d;public:output()return d;Y3的构成的构成-私有:私有:d b c 保护:保护:公有:公有:output()不可直接访问:不可直接访问:a(仍属于基类仍属于基类)第16页,此课件共60页哦(1)public继承方式继承方式在在public继承方式下,派生类内的成员函数中可以访继承方式下,派生类内的成员函数中可以访问基类和派生类中的保护成员
13、,但外部程序中定义的问基类和派生类中的保护成员,但外部程序中定义的派生类对象不可访问基类和派生类中的保护成员。派生类对象不可访问基类和派生类中的保护成员。Eg.例题例题“public继承继承”在在public继承方式下,派生类内的成员函数中可以访问基继承方式下,派生类内的成员函数中可以访问基类和派生类中的保护成员,但外部程序中定义的派生类类和派生类中的保护成员,但外部程序中定义的派生类对象不可访问基类和派生类中的保护成员。对象不可访问基类和派生类中的保护成员。Eg.例题例题“private继承继承”(2)private继承方式继承方式第17页,此课件共60页哦三、派生类的构造函数三、派生类的构
14、造函数继承关系中,基类的两个特殊成员函数继承关系中,基类的两个特殊成员函数-构造函数构造函数和析构函数不能被继承。和析构函数不能被继承。因此,派生类的构造函数不仅要初始化派生类中定因此,派生类的构造函数不仅要初始化派生类中定义的数据成员,而且要初始化派生类中的义的数据成员,而且要初始化派生类中的基类子对基类子对象象(派生类对象中由基类定义的部分称作基类子对象)。派生类对象中由基类定义的部分称作基类子对象)。基类子对象的初始化赋值是通过在派生类构造函数中基类子对象的初始化赋值是通过在派生类构造函数中显式或隐式地显式或隐式地调用基类构造函数实现的。调用基类构造函数实现的。构造函数的执行顺序:先执行
15、基类构造函数,再执行派构造函数的执行顺序:先执行基类构造函数,再执行派生类构造函数。生类构造函数。基类子对象基类子对象派生类派生类专有部分专有部分派生类派生类第20页,此课件共60页哦例例1:1:P267P267例题例题class A int a1;protected:int a2;public:int a3;A()a1=a2=a3=0;A(int x1,int x2,int x3):a1(x1),a2(x2),a3(x3)void out()couta1 a2 a3endl;int Geta1()return a1;返回类返回类第21页,此课件共60页哦class B:public A in
16、t b1;protected:int b2;public:int b3;B()b1=b2=b3=0;B(int x1,int x2,int x3):A(x1,x2,x3)b1=x1+1;b2=x2+2;b3=x3+3;void out()A:out();coutb1 b2 b3endl;int Sum()return Geta1()*b1+a2*b2+a3*b3;隐含调用隐含调用A()显式调用显式调用A(int,int,int)调用类中的调用类中的无参构造函数无参构造函数返回返回main()函数函数/类和类中都有类和类中都有Out(),则用则用:界定其所属,若不加则指的界定其所属,若不加则指的
17、是本类成员是本类成员调用类中的调用类中的带参构造函数带参构造函数第22页,此课件共60页哦void main()void main()B b1,b2(1,2,3);B b1,b2(1,2,3);b1.Out();b1.Out();b2.Out();b2.Out();coutb1.Sum()coutb1.Sum()b2.Sum()endl;b2.Sum()endl;coutsizeof(B)endl;coutsizeof(B)endl;调用类调用类B B中的中的构造函数构造函数初始化对象初始化对象第23页,此课件共60页哦四、派生类的析构函数四、派生类的析构函数撤销派生类对象时,系统先自动调用派
18、生类的析构函数,撤销派生类对象时,系统先自动调用派生类的析构函数,再调用基类的析构函数。再调用基类的析构函数。系统对派生类和基类析构函数的自动调用顺序和其对系统对派生类和基类析构函数的自动调用顺序和其对构造函数的调用顺序正好相反构造函数的调用顺序正好相反。例:类层次中普通析构函数例:类层次中普通析构函数第24页,此课件共60页哦五、基类和派生类的赋值兼容规则五、基类和派生类的赋值兼容规则在满足在满足公有继承公有继承的限制条件下,的限制条件下,C+允许派生类对象到允许派生类对象到基类对象的自动转换,通常称为赋值兼容规则。基类对象的自动转换,通常称为赋值兼容规则。规则规则1:可以用派生类对象:可以
19、用派生类对象为基类对象赋值为基类对象赋值 规则规则2:可以用派生类对象:可以用派生类对象初始化基类的引用对象初始化基类的引用对象 规则规则3:可以用:可以用基类的指针基类的指针指向派生类对象指向派生类对象eg.赋值兼容规则赋值兼容规则eg.类层次中普通析构函数类层次中普通析构函数第25页,此课件共60页哦9.2 多重继承多重继承 多级继承多级继承引例:引例:Windows风格用户界面设计风格用户界面设计 先设计出窗口类、尺寸类、横向先设计出窗口类、尺寸类、横向/纵向滚动条类、按纵向滚动条类、按钮类;用户界面类将上述各类作为基类,通过多重继钮类;用户界面类将上述各类作为基类,通过多重继承产生。承
20、产生。一、多重继承时的派生类一、多重继承时的派生类 1、定义格式:、定义格式:class 派生类名:派生类名:继承方式继承方式1基类名基类名1,继承方式继承方式2基类名基类名2,派生类成员定义派生类成员定义;注:各基类名不能相同注:各基类名不能相同第26页,此课件共60页哦2 2、初始化数据成员、初始化数据成员调用构造函数调用构造函数1 1)调用顺序)调用顺序 构造函数调用顺序:构造函数调用顺序:(1)(1)初始化第一个基类子对象,即调用第一个基类的构造函数;初始化第一个基类子对象,即调用第一个基类的构造函数;初始化第二个基类子对象,即调用第二个基类的构造函数;初始化第二个基类子对象,即调用第
21、二个基类的构造函数;初始化第初始化第n n个基类子对象,即调用第个基类子对象,即调用第n n个基类的构造函数。个基类的构造函数。(2)(2)派生类中若有基类对象作成员,则调用相应基类的构造函数。派生类中若有基类对象作成员,则调用相应基类的构造函数。(3)(3)最后初始化派生类普通成员。最后初始化派生类普通成员。析构函数调用顺序:与构造函数相反。析构函数调用顺序:与构造函数相反。第27页,此课件共60页哦例例:多重继承时的构造函数的调用多重继承时的构造函数的调用P269P269说明:派生类初始化成员的顺序说明:派生类初始化成员的顺序:首先对首先对基类子对象成员基类子对象成员的初始化的初始化,然后
22、对然后对新增对象成员新增对象成员初始化初始化,最后对最后对新增非对象成员新增非对象成员初始化初始化.注注:前两步必须在构造函数的初值表中给出初值项前两步必须在构造函数的初值表中给出初值项 (省略时调用无参构造函数省略时调用无参构造函数););后一步可以通过初值表后一步可以通过初值表,也可以通过函数体进行也可以通过函数体进行.第28页,此课件共60页哦二、多级继承中的派生类二、多级继承中的派生类 class A class A ;class B:public A class B:public A ;class C:public B class C:public B ;B B直接继承类直接继承类A
23、 A,C C直接继承类直接继承类B B,间接继承类,间接继承类A A。eg.P270 eg.P270 多级继承举例多级继承举例多级继承时的初始化顺序多级继承时的初始化顺序:先执行最上层基类的构造函数先执行最上层基类的构造函数,依次依次向下执行各基类的构造函数向下执行各基类的构造函数,最后是当前派生类的构造函数对新增最后是当前派生类的构造函数对新增成员的初始化成员的初始化.第29页,此课件共60页哦 执行执行C C的构造函数前先调用的构造函数前先调用B1B1、B2B2构造函数;执行构造函数;执行B1B1、B2B2构造函数前先分别调用构造函数前先分别调用A A的构造函数。的构造函数。A AB1B1
24、B2B2C CA A为为C C的公共基类的公共基类eg.eg.数据成员二义性数据成员二义性三、混合多继承中的构造函数三、混合多继承中的构造函数class C:public B1,public B2 ;第30页,此课件共60页哦1 1、数据成员二义性、数据成员二义性 假设图中类假设图中类A A有数据成员有数据成员a a,则则C C中有两个中有两个a a成员,成员,a a是哪个是哪个 派生类的成员?产生了二义性。派生类的成员?产生了二义性。解决方法:解决方法:(1)(1)加类名分辨符加类名分辨符B1:B1:或或 B2:B2:(2)(2)定义虚基类定义虚基类 eg1.eg1.数据成员二义性数据成员二
25、义性A(a)A(a)B1(a,b1)B1(a,b1)B2(a,b2)B2(a,b2)C(a,b1,b2,c)C(a,b1,b2,c)四、多继承中二义性问题的解决四、多继承中二义性问题的解决第31页,此课件共60页哦2 2、函数成员二义性、函数成员二义性 B1,B2B1,B2中都含有中都含有print()print()成员函数,成员函数,C C继承了继承了B1,B2B1,B2,则则C C中有两个中有两个print()print()函数。函数。解决方法:加类区分符解决方法:加类区分符:eg2.eg2.函数成员二义性函数成员二义性B1(print()B1(print()B2(print()B2(pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承 多态性 课件
限制150内