面向对象的程序设计.ppt_第1页
面向对象的程序设计.ppt_第2页
面向对象的程序设计.ppt_第3页
面向对象的程序设计.ppt_第4页
面向对象的程序设计.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5Polymorphism(2),Object-OrientedProgramminginC+,计算机科学与技术学院刘培强liupqhttp:/liupqT,2010-2011-01电信08计科09,1/20,Content,5.3NameOverloading,NameOverriding,andNameHiding5.4AbstractBaseClasses5.5Run-TimeTypeIdentificationSample:ShapeHierarchySample:List,Queue,Stack,2/20,5.3Nameoverloading,overriding,hiding,Nameoverloading(重载、过载)Top-levelfunctionscanshareanameiftheyhavedifferentsignatures(签名).Methodsinthesameclasscanshareanameiftheyhavedifferentsignatures.,classCpublic:C()/defaultconstructorC(intx)/convertconstructor;voidprint(doubled);voidprint(char*);intmain()Cc1,c2(26);print(100.123);print(“100.123”);,编译过程中绑定函数调用和对应的函数体,3/20,5.3Nameoverloading,overriding,hiding,Nameoverriding(重置、覆盖)若基类方法B:m和派生类方法D:m具有相同的函数签名,且基类方法B:m是virtual方法,则D:m重置了B:m。当通过基类指针或引用访问被重置的方法m时,需要运行时动态绑定。,classBpublic:virtualvoidm();classD:publicBpublic:voidm();,重置了基类方法,仍然为虚函数,intmain()B*p=newD;p-m();/动态绑定D:m()return0;,virtual,静态绑定B:m(),4/20,5.3Nameoverloading,overriding,hiding,Namehiding(隐藏)若基类B定义了非虚方法m,同时其派生类D也定义了方法m,此时,我们说派生类方法D:m隐藏了继承自基类的同名方法B:m。,classBpublic:voidm(intx);classD:publicBpublic:voidm();,intmain()Dd1;d1.m();/invokesD:m()d1.m(10);/ERRORreturn0;,d1.B:m(10);/OK,5/20,5.3Nameoverloading,overriding,hiding,Namehidingandvirtualmethod,classBpublic:virtualvoidm(intx);classD:publicBpublic:virtualvoidm();,intmain()Dd1;d1.m();/invokesD:m()d1.m(10);/ERRORreturn0;,由于函数签名不同,所以二者不构成重置。故D:m隐藏了B:m。,d1.B:m(10);/OK,6/20,5.3Nameoverloading,overriding,hiding,函数同名的一般理由如下:以Top-level函数形式定义时,形成过载,表示他们完成相同的概念操作;同一个类中的非构造函数,若同名则形成过载,表示他们完成相同的概念操作;一个类存在多个构造函数:defaultconstructor,copyconstructor,convertconstructer,在一个类继承层次中,为支持方法多态,由基类定义虚函数,在派生类中重新定义重置。,7/20,内容回顾,基类中定义虚方法的目的:为了支持方法多态,同时表明:虚方法是同一族类所具有的共同接口(Interface),且其语义与类型相关。,classBCpublic:virtualvoidf();classDC:publicBCpublic:voidf();,BC*pb=newBC;pb-f();/BC:fpb=newDC;pb-f();/DC:f,1,2,2,3,派生类重置基类的虚方法,通过基类指针或引用访问虚方法,8/20,内容回顾,派生类可以不重置基类的虚方法,也能表明它具有基类的对外接口(Interface)。,classBCpublic:virtualvoidf();classDC:publicBCpublic:voidf();,BC*pb=newBC;pb-f();/BC:fpb=newDC;pb-f();/DC:f,1,2,2,3,派生类重置基类的虚方法,通过基类指针或引用访问虚方法,/Nothasf();,BC:f,9/20,内容回顾,在实际应用中,有时候要求派生类必须重置基类虚方法。,classAnimalpublic:virtualvoidspeak()?;,现实中不存在Animal的实例,也没有相同的Language,classBull:publicAnimalpublic:voidspeak()cout“Moo!”endl;,classDog:publicAnimalpublic:voidspeak()cout“Woof!”endl;,10/20,AbstractBaseClasses(抽象基类),Anabstractclassisabstractinthatnoobjectscaninstantiateit.充要条件:至少有一个纯虚(purevirtual)方法.Apurevirtualmethodisonewhosedeclarationendswiththespecialsyntax=0.,classAnimalpublic:virtualvoidspeak()=0;Animalobj;/ERROR,11/20,AbstractBaseClasses(抽象基类),抽象类通常有派生类没有派生类的抽象类是多余的.派生类可以不重置基类的纯虚函数,此时派生类也是一个抽象类(不可能有实例)。,classAnimalpublic:virtualvoidspeak()=0;Animalobj;/ERROR,classFourLegsAnimal:publicAnimalpublic:/virtualvoidspeak()=0;FourLegsAnimalobj;/ERROR,12/20,AbstractBaseClasses(抽象基类),抽象类特征:可以有多个(1)纯虚方法;可以有非纯虚方法;可以有非虚方法;可以有数据成员;可以定义成员的访问控制(对外能见度)。,所有类的特点,classABCpublic:ABC()ABC(intx)ABC()virtualvoidopen()=0;virtualvoidprint()intgetCount()private:intn;,13/20,AbstractBaseClasses(抽象基类),抽象类用途抽象基类用来说明一族类的共同接口(sharedinterface).,BasicFile,InFile,OutFile,classBasicFilepublic:virtualintopen()=0;virtualintclose()=0;virtualintflush()=0;,classInFile:publicBasicFilepublic:virtualintopen();virtualintclose();virtualintflush();,classOutFile:publicBasicFilepublic:virtualintopen();virtualintclose();virtualintflush();,14/20,AbstractBaseClasses(抽象基类),抽象类用途抽象类可以用来表明某种软件设计需求。,classIIntroSpectpublic:virtualvoidlistFields()=0;virtualvoidlistMethods()=0;,classMyClass/有实例的类:publicIIntroSpectpublic:voidlistFields();voidlistMethods();/othermembersofMyClass;,15/20,应用举例Shape(形状)hierarchy,所有图形的部分共性:Draw(显示)Resize(改变大小)Move(移动),16/20,应用举例Shape(形状)hierarchy,Shape,Point,Line,Circle,Triangle,Rectangle,RealLine,DashLine,Ellipse,所有图形的共性定义在基类Shape中,17/20,classShapepublic:virtualvoidDraw()=0;virtualvoidMove(doubledx,doubledy)=0;virtualvoidResize(doublerate)=0;virtualShape()/;,classPoint:publicShapepublic:Point(doublevx=0,doublevy=0):x(vx),y(vy)voidDraw()voidMove(doubledx,doubledy)x+=dx;y+=dy;voidResize(doublerate)private:doublex,y;,18/20,classShapepublic:virtualvoidDraw()=0;virtualvoidMove(doubledx,doubledy)=0;virtualvoidResize(doublerate)=0;virtualShape()/;,classLine:publicShapepublic:Line(Pointl,Pointr):Left(l),Right(r)/virtualvoidDraw()=0;voidMove(doubledx,doubledy)Left.Move(dx,dy);Right.Move(dx,dy);voidResize(doublerate)private:PointLeft,Right;/othermembersofLine;,classDashLine:publicLinepublic:voidDraw()/Move()无需重置/Resize()无需重置;,19/20,classShapepublic:virtualvoidDraw()=0;virtualvoidMove(doubledx,doubledy)=0;virtualvoidResize(doublerate)=0;virtualShape()/;,classPaintApp/绘图程序public:voidGetSh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论