版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章类间数据与函数类与类之间的关系可以分为:组合、、继承以及嵌套关系。从某种意义上讲,类相当于一种自定义的数据类型,当一个新的类中申明该数据类型时,即为类的组合关系;和函数类似,在一个新的类中申明一个已经存在的类为,即为该类的类,类与函数有相似的特征;当一个类具有已存在的类某些特征时,同时赋予给类一些新的特征,此即为类的继承关系。继承是面向对象重要特征。在一个新的类内部可以包含一个新申明的类,该类依赖外部类而存在,这种类关系称之为嵌套。第一节类的组合第二节类第三节类的继承第四节第五节第六节纯虚函数与抽象类 第八节第九节第一节类的组合 例程3-usingnamespaceusingnamespaceclassDate(intYear=1973,intMonth=1,int}void}int}intclassStudent(stringName,Date}conststringreturnthis-}Datereturnthis-}stringDateBirthDay;//Student组合进DateintDateintDateStudentreturn}例程3-usingusingnamespaceclassNode(longthis->pHead=newint[this-}int*getAddrHead()const{//获得Nodereturn}int*getAddrHead()const{//获得Nodereturnthis-}voidsetAddrNext(Node*ptr){//设置pNext}longreturnthis-}longint*pHead;//NodeNode*pNext;//structArray(intthis->firstNode=newNode(this-}Node*return}Node*returnthis-}voidNode*newNodeAddr=newNode(this-}longunitSize;//Node*firstNode;//Node*lastNode;//intArrayint*p=myArr.getHead()-intsize=myArr.getHead()-for(int}return 第二 例程3-usingnamespaceusingnamespaceclassstd::cout<<"NowIn}Teacher(stringName,stringfriendclassstringstringstringstringclassStudent(stringName,stringDescription,int}voidsetTeacher(constTeacher}voiddis}TeacherstringstringintintStudentMe("John","HeintStudentMe("John","HeisgoodTeacherMr("Tom","Heisgood return} 第三节类的继承植物被分类为门、纲、目、科、属、种,每个子类都具有父类的特征,但同时具有一些新的特征,子类还可以继续分为子类。在人类社会,人具有一些共同特征,同时不同人群还具有特有的特征。这些关系,就是继承关系。父类还可以称为基类,子类还可以称为派生类。类的继承关系,是面向对象体系中最为重要的关系。如例程3-4所示。例程3-usingnamespaceusingnamespaceclassclass(stringID,stringName,boolvoid}stringID;//号stringbool;//,男为1,女为classStudent:public Student(intGrade,stringName,stringStudent(intGrade,stringName,stringID,bool):(ID,Name,}void}intGrade;//classTeacher:publicTeacher(stringofficeNo,stringTitle,stringName,stringID,bool):(ID,Name,}void}}stringofficeNo;//编stringintTeacherStudentreturn} 第四节多重继承与虚基类usingnamespaceusingnamespaceclassA(inta=1):valA(a){cout<<"InA's~A(){cout<<"InAB'svoidprint(){cout<<"PrintingInA'sintclassB(intb=1):valB(b){cout<<"InB's~B(){cout<<"InB'svoidprint(){cout<<"PrintingInB'sintclassAB:publicB,public例程3-AB(intab=1):valAB(ab){cout<<"InAB'sAB(intab=1):valAB(ab){cout<<"InAB's~AB(){cout<<"InAB'svoidcout<<"PrintingInAB's}intintABreturn}例程3-classclassZ(inta=1):valZ(a){cout<<"InZ's~Z(){cout<<"InZ'svoidprint(){cout<<"PrintingInZ'sintclassA:virtualpublicA(inta=1):valA(a){cout<<"InA's~A(){cout<<"InAB'svoidprint(){cout<<"PrintingInA'sintclassB:virtualpublicB(intb=1):valB(b){cout<<"InB's~B(){cout<<"InB'svoidprint(){cout<<"PrintingInB'sintclassintclassAB:publicB,publicAB(intab=1):valAB(ab){cout<<"InAB's~AB(){cout<<"InAB'svoidcout<<"PrintingInAB's}intintABreturn}图3-1虚拟(右)与非虚拟(左)继承关系第五节虚函数 义形式为voiddis y(Shape*pShape)。在运行过程中,会自动根据运行场景,或选择Circle的dis 虚函数。如将函数定义形式修改为voiddis y(Shape&pShape),则需 例程3-usingnamespaceconstusingnamespaceconstdouble
classclassvirtualvoiddiscout<<"Thisisa}classCircle:publicShape{//Circle(intvoiddiscout<<"Iamacircle!!!Area="<<this-}intRadius;//classRectangle:publicShape{//Rectangle(intW=1,intvoiddiscout<<"IamaRectangle!!!Area="<<this->width*this-}intwidth,height;//voidintwidth,height;//voiddisy(Shape}intRectangleCirclereturn}用一个函数应对多个应用,是多态性体现。voiddisy(Shape*pShape)或voiddisy(Shape&pShape)的参数有确定类型,但由于Shape类是Circle和Rectangle的基类,且申明为虚函数,由此实现对象的动态绑定。虚函数经过派生之后,在其派生类中就可以实现运行过程中的动态。另外,虚函数必须申明为非静态的成员函数。第六节纯虚函数与抽象类比较例程3-8和例程3-7可以发现,仅shape类中的dis y()函数发生变化,其他代码维持不变。例程3-8中,dis y()没有代码实现,其函数名称后增加了“=0”,表明其为纯虚函数,含有纯虚函数的类称之为抽象类。抽象类不能单独存在,依赖于派生类而实例化,即不能单独申明抽象类的对象。usingnamespaceusingnamespaceconstdouble classvirtualvoid classCircle:publicShape{//Circle(intvoid cout<<"Iamacircle!!!Area="<<this-}intRadius;//classRectangle:publicShape{//Rectangle(intW=1,intvoid cout<<"IamaRectangle!!!Area="<<this->width*this-cout<<"IamaRectangle!!!Area="<<this->width*this-}intwidth,height;//voiddisy(Shape}intRectangleCirclereturn}第七 控 45行所示;当以protected继承基类时,public成员被降格为protected,protected不发生变化,private已不能再降,此时派生类的对象不能 基类所有成员;当以private继承基类时,public和protected都降格为private成员,private维持不变,此时派生类的对象不能 例程3-usingnamespaceusingnamespaceclassABC(inta=1,intb=2,intintintintclassX:publicvoid}class}classY:protectedvoid}classZ:privatevoid}classfromZ:publicZ{//ZprivateclassfromZ:publicZ{//Zprivatefromvoid}intABCXx;//X以public方式继承 YYZz;//Z以private方式继承fromZreturn} 第八节类的嵌套类的嵌套是在类的内部申明一个新类,该类仅在外部类的内部存在,如例程3-10所示。被嵌套类被封装在外部类中,不能单独存在。如果一个类仅能在某个类的内部存在,采用嵌套类是不错的选择。例程3-usingnamespaceclassusingnamespaceclassList(intthis->pDataHead=newNode(this-}classNode(intcout<<"IaminNodethis->pNode=newint[this-}intreturnthis-}voidreturnthis-}voidprint()const;//intintintintNodevoid}intListreturn}在第20行voidprint()const申明print()函数的原型,其实现在第30-32行实现,注意其print()前作用域运算符的使用第九节类关系中的函数类可以集成数据成员和函数成员。一个类只有被实例化后,其内部的函数和数据才能被应用。在不同的类关系中,不同类型的函数,有较为复杂的关系。在例程3-11中,类与类之间有多种关系。在类A中,申明类B是类A的 类。当申明Aa时(第49行),可以发现类A的a对象执行实例化时,类B并没有被实例化。在类A中申明B是其 类,但A并不包含B的数据。相反,当在实例化类B的b对象时(第53行),由于B类中有申明类A的实例a对象,因此首先实例化A类(A类的构造函数被执行),然后执行B类的构造函数。类Y继承自类C,当实例化类Y为y对象时(第51行),首先基类被实例化(执行C的构造函数),然后才是派生类被实例化(执行Y的构造函数)。类B除了组合A类外,还嵌套类D,当39行被注释时,类D虽然在类X申明原型,但未使用,此时不会执行类D的构造函数,知道第30行doSome()函数被执行时,类D才会被实例化。如果第39行未被注释,则优先实例化类D,然后示例化类X。析构函数严格按照构造函数相反次序执行,因为要考虑潜在的相关性。另外,构造函数调用次序完全不受构造函数的初始化表达式的次序影响,该次序是以后成员在类中的申明次序所决定。例程3-usingnamespaceusingnamespaceclassA(){cout<<"IaminA's~A(){cout<<"IaminA'svoidprint(){cout<<"PrintingInClassfriendclassclassB(){cout<<"IclassB(){cout<<"IaminB's~B(){cout<<"IaminB'svoidprint(){cout<<"PrintingInClassvoidexecAprint(){this-AclassC(){cout<<"IaminC's~C(){cout<<"IaminC'svoidprint(){cout<<"PrintingInClassclassX(){cout<<"IaminC's~X(){cout<<"IaminC'svoidprint(){cout<<"PrintingInClassvoiddoSome(){DAa;//classAa;//classD(){cout<<"IaminD's~D(){cout<<"IaminD'svo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工现场电梯使用安全保障方案
- 2024年国际银行卡支付服务协议
- 2024医疗机构LED医疗设备采购合同
- 2024年专用:婚前财产共有协议
- 残疾人文化活动推广方案
- 电力系统应急响应培训方案
- 金融机构与高校创业支持协议书
- 农业科技软件售后支持方案
- 2024年信用展期合同范本
- 2024年二手房屋交易按揭贷款合同
- 各专业文件准备目录-内分泌科药物临床试验机构GCP SOP
- 车间员工安全培训试题附参考答案【典型题】
- 2024年物业管理师(中级四级)考试题库大全-上(单选、多选题)
- 2024年人教部编版语文六年级上册期中测试题及答案(一)
- 《江西数学三年级上学期数学期中试卷》
- 2024年10月福建三明宁化县城市管理和综合执法局公开招聘非在编协管员11人笔试历年典型考点(频考点试卷)解题思路附带答案详解
- 2024年环保知识生态建设知识竞赛-环保基础知识竞赛考试近5年真题附答案
- 《万维网安全新协议》课件 2024-2025学年人教版新教材初中信息技术七年级全一册
- 2024中国邮政集团河北省分公司春季校园招聘高频难、易错点500题模拟试题附带答案详解
- 部编版历史高一上学期期中试卷与参考答案(2024-2025学年)
- 人教版(2019)必修 第三册Unit 5 The value of money 单元集体备课教案
评论
0/150
提交评论