




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.3类的继承,继承是面向对象程序设计方法的四个基本特征之一,是程序代码可重用性的具体体现。在C+面向对象程序设计中,所谓类的继承就是利用现有的类创建一个新的类。新类继承了现有类的属性和行为。为了使新类具有自己所需的功能,它可以扩充和完善现有类的属性和行为,使之更具体。微软基础类MFC就是通过类的继承来体现类的可重用性和可扩充性。,继承,发扬,1,3.3.1基类和派生类,在现实世界中,一类事物的对象常常也属于另一类事物。在面向对象程序设计方法中,一个类的对象也常常是另一个类的对象,即一个类具有了另一个类的属性和方法。在定义一个类时,根据类的继承性,我们能够且应尽可能地利用现有的类来定制新的类,而不必重新设计新的类。,1.问题的提出,2,在继承关系中,新定义的类称为被继承类的派生类或子类,而被继承的类称为新定义类的基类或父类。派生类继承了基类的所有成员。一个派生类也可以作为另一个派生类的基类。,2.基类和派生类的概念,class:./派生类新增加的成员声明列表;,3.派生类的定义,3,派生方式决定了基类的成员在派生类中的访问权限。派生方式共有三种:public、private和protected(缺省值为private)。虽然派生类继承了基类的所有成员,但为了不破坏基类的封装性,无论采用哪种派生方式,基类的私有成员在派生类中都是不可见的,即不允许在派生类的成员函数中访问基类的私有成员。,说明:,4,采用public派生,基类成员的访问权限在派生类中保持不变,即基类所有的公有或保护成员在派生类中仍为公有或保护成员。public派生最常用。(1)可以在派生类的成员函数中访问基类的非私有成员;(2)可通过派生类的对象直接访问基类的公有成员。采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类的成员函数中访问基类的非私有成员。private派生很少使用。采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。,三种派生方式的区别:,5,例定义类Point,然后定义类Point的派生类Circle。,#includeclassPoint/定义基类,表示点private:intx;inty;public:voidsetPoint(inta,intb)x=a;y=b;/设置坐标intgetX()returnx;/取得X坐标intgetY()returny;/取得Y坐标;,6,classCircle:publicPoint/定义派生类,表示圆private:intradius;public:voidsetRadius(intr)radius=r;/设置半径intgetRadius()returnradius;/取得半径intgetUpperLeftX()returngetX()radius;/取得外接正方形左上角的X坐标intgetUpperLeftY()returngetY()+radius;/取得外接正方形左上角的Y坐标;,7,main()Circlec;c.setPoint(200,250);c.setRadius(100);coutX=c.getX(),Y=c.getY(),Radius=c.getRadius()endl;coutUpperLeftX=c.getUpperLeftX(),UpperLeftY=c.getUpperLeftY()endl;,公有派生类的对象可以直接访问基类Point的公有成员,程序运行结果:X=200,Y=250,Radius=100UpperLeftX=100,UpperLeftY=350,8,派生类Circle通过public派生方式继承了基类Point的所有成员(除私有成员外所有成员的访问权限不变),同时还定义了自己的成员变量和成员函数。若将类Circle的派生方式改为private或protected,则下述语句是非法的:c.setPoint(200,250);,说明:,!,容易混淆,无论哪种派生方式,派生类都继承了基类的所有成员,包括私有成员。我们虽然不能在派生类Circle中直接访问私有数据成员x和y,但可以通过继承的公有成员函数getX()、getY()和setPoint()访问或设置它们。,9,利用类继承定义类可能带来一个问题:派生类会继承它不需要的基类中的数据成员和成员函数,这时,基类中不适合于派生类的成员可以在派生类中重新加以定义。,最后一个问题:,?,例派生类成员函数对基类成员函数的覆盖。,#includeclassApublic:voidShow()coutA:Shown;,10,classB:publicApublic:voidShow()coutB:Shown;/在派生类中重新定义成员函数voidDisplay()Show();/调用派生类B的成员函数Show();voidmain()Aa;Bb;a.Show();/调用基类A的成员函数Show()b.Show();/调用派生类B的成员函数Show()b.Display();,如果想调用基类A的成员函数Show(),可以使用作用域限定符“:”:A:Show();,11,从本例可以看出,虽然派生类继承了基类的所有成员函数,但如果派生类某个成员函数的名称和参数与基类成员函数一致(即在派生类中对该成员函数重新进行了定义),则在派生类中调用的成员函数是派生类的成员函数。请问:如果在派生类B中没有对成员函数Show()重新进行定义,程序运行结果如何?,程序运行结果:A:ShowB:ShowB:Show,?,12,3.3.2基类和派生类的构造函数,一个派生类对象也属于其基类,因此当程序创建一个派生类对象时,系统首先自动创建一个基类对象。在调用派生类的构造函数构建派生类对象时,系统首先调用基类的构造函数构建基类对象。当派生类对象的生存期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。,1.问题的提出,编译器在对程序编译时,首先生成基类构造函数的调用代码,然后生成派生类构造函数的调用代码。,13,隐式调用和显式调用两种方式:,2.基类构造函数的调用方式,注意:除非基类有默认的构造函数,否则必须采用显式调用方式。,(1)隐式方式是指在派生类的构造函数中不指定对应的基类的构造函数,调用的是基类的默认构造函数(即含有缺省参数值或不带参数的构造函数)。(2)显式方式是指在派生类的构造函数中指定要调用的基类构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。,!,14,设类B是类A的派生类,则派生类B显式方式构造函数的定义形式如下:,3.显式方式构造函数的定义,B:B():A()./类B构造函数的实现代码,形参声明中的部分参数,传递给基类构造函数,派生类构造函数形参的名称和类型,派生类构造函数既初始化派生类的数据成员,又通过基类构造函数初始化其基类的数据成员。参数表中参数的个数和类型要与基类某个构造函数的形参声明一致。,15,PointCircleCylinder,注意:当基类有多个构造函数时,编译器根据派生类构造函数为基类构造函数提供的参数表来确定调用基类的哪一个构造函数。,例首先定义类Point,然后定义类Point的派生类Circle,再定义类Circle的派生类Cylinder。,16,#includeclassPoint/定义基类Pointprotected:intx,y;public:Point(inta=0,intb=0)/含有缺省参数值的构造函数也是默认的构造函数x=a;y=b;coutPointconstructor:x,yendl;Point()coutPointdestructor:x,yendl;,17,classCircle:publicPoint/定义类Point的派生类protected:intradius;public:/显式调用基类的构造函数Circle(inta=0,intb=0,intr=0):Point(a,b)radius=r;coutCircleconstructor:radiusx,yendl;Circle()coutCircledestructor:radiusx,yendl;,18,classCylinder:publicCircle/定义类Circle的派生类protected:intheight;public:/显式调用基类的构造函数Cylinder(inta=0,intb=0,intr=0,inth=0):Circle(a,b,r)height=h;coutCylinderconstructor:heightradiusx,yendl;Cylinder()coutCylinderdestructor:heightradiusx,yendl;,19,main()Cylindercylinder(200,300,100,400);/调用了类Point、Circle和Cylinder的构造函数,Pointconstructor:200,300Circleconstructor:100200,300Cylinderconstructor:400100200,300Cylinderdestructor:400100200,300Circledestructor:100200,300Pointdestructor:200,300,程序运行结果:,20,构造函数的执行顺序:,析构函数的执行顺序:,Point(),Circle(),Cylinder(),当声明Cylinder对象时,Cylinder(),Circle(),Point(),当程序结束时,21,3.3.3多重继承,1.单继承和多重继承的概念,classA,classB,classC,classA,classB,classC,每个派生类只有一个直接基类单继承,一个派生类同时从多个基类派生而来,即有多个直接基类多重继承,22,2.多重继承派生类的定义,设类B是类A1、A2、An的派生类,多重继承的派生类的定义形式为:,class:,./派生类新增加的成员声明列表;,多重继承的派生方式也有private、public和protected三种,各基类的派生方式可以不同,23,例定义一个派生类MultiDerived,它是类BaseA和BaseB的派生类。,classBaseA/定义基类protected:inta;public:voidsetA(int);,classBaseB/定义基类protected:intb;public:voidsetB(int);,定义两个基类,24,classMultiDerived:publicBaseA,publicBaseB/定义多重继承的派生类public:intgetAB();/添加成员函数;,voidBaseA:setA(intx)a=x;voidBaseB:setB(intx)b=x;,intMultiDerived:getAB()returna+b;,可以直接访问基类中protected属性成员,成员函数的实现,25,main()MultiDerivedmd;/声明派生类的对象md.setA(30);/调用基类BaseA的成员函数md.setB(70);/调用基类BaseB的成员函数couta+b=md.getAB()endl;/调用派生类MultiDerived自定义的成员函数,程序运行结果:a+b=100,26,3.3.4虚基类,1.多重继承中的二义性问题,classC:publicApublic:intc;classD:publicB,publicC/类D派生于类B和类Cpublic:intd;main()Dd1;d1.a=100;,classApublic:inta;classB:publicApublic:intb;,二义性错误:编译器无法确定数据成员a是哪一个副本,?,27,classB,classC,classD,classA,派生类D的对象中存在间接基类A的两份副本,28,2.解决方法,利用作用域限定符(:)把基类的成员与下一层基类关联起来:d1.B:a=100;或:d1.C:a=100,从路径DBA继承而来,从路径DCA继承而来,缺点:浪费了存储空间;在访问基类的成员时,要求指明访问路径。大部分情况下不需要保存基类多个相同的副本。,29,3.使用虚基类,虚基类并不是一种新的类型的类,而是一种派生方式。采用虚基类方式定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五Oracle企业数字化转型咨询服务协议
- 二零二五年度二次结构工程材料供应合同范本下载
- 二零二五年度建筑工地民工劳动权益保护及法律援助合同
- 二零二五年度建筑工程造价咨询委托协议书
- 二零二五年度建筑公司整体转让及安全管理合同
- 二零二五年度文化产业项目劳务派遣合作合同
- 二零二五年度物流快递车辆加盟服务合同
- 2025至2030年中国黑龙江省房地产市场深度分析及投资战略咨询报告
- 二零二五年度高科技项目工程战略合作协议书
- 2025版办公楼物业综合服务及设施设备更新改造合同模板
- 2025年海南省公安厅招聘警务辅助人员考试试题(含答案)
- 2025年河北中考生物真题含答案
- 中华诗词大赛1-3年级题库(含答案)
- 2025年山东高考化学试卷真题及答案详解解读(精校打印)
- 医院检验科制度汇编
- 2022年版 义务教育《数学》课程标准
- HG/T 6312-2024 化工园区竞争力评价导则(正式版)
- 全国农牧渔业丰收奖经济效益计算办法(共22页)
- 甘肃铁矿等34个矿种矿业权出让收益场基准价(优.选)
- 北京市顺义区土地开发整理规划
- KJ95N系统介绍
评论
0/150
提交评论