面向对象编程技术第八章.ppt_第1页
面向对象编程技术第八章.ppt_第2页
面向对象编程技术第八章.ppt_第3页
面向对象编程技术第八章.ppt_第4页
面向对象编程技术第八章.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第八章多态,问题的提出多态在本章的表现形式总结与建议,头说:大家去工作吧,1.多态定义:不同类型的对象接收同样的消息产生不同的行为2.现实需要多态;面向对象需要多态:它以归整划一的方式在特定时刻处理多个类型不同的对象,返回,运算符重载虚函数抽象类纯虚函数,多态在本章主要的表现形式,返回,运算符重载,设计思想运算符重载的基本形式运算符重载的实例注意事项,返回,运算符重载设计思想,扩展系统已有运算符的功能,能处理自定义数据类型定义与特定运算符同名的函数此函数与类相关联(成员或友元)以函数处理特定的自定义数据类型C系统通过函数重载的方式来定位、执行此特殊函数,返回,运算符重载分类,运算符重载,按载体,类的成员函数类的友元函数,按对象个数,重载单目运算符:前置与后置重载双目运算符,返回,可以重载为普通函数吗?看完所有例子再回答,呵呵!,重载分类之一,重载为类成员函数参数个数=原操作数个数1(后置+、-除外)重载为友元函数参数个数=原操作数个数,且至少应该有一个自定义类型的形参,要理解参数个数的原因,格式,重载为类成员函数格式:函数类型operator运算符(形参).,重载为友元函数格式friendly函数类型operator运算符(形参).,返回,Operator:重载关键字,重载分类之二,单目运算符,前置单目运算符:Uoprd无形参,表达式Uoprd相当于oprd.operatorU()后置单目运算符oprdU有一个int类型形参表达式oprd+相当于oprd.operator+(0),oprd为特定的对象,重载分类之二,oprd1、oprd2为特定类的对象,双目运算符B:重载后:表达式oprd1Boprd2相当于oprd1.operatorB(oprd2),返回,重载举例1用“+”、“-”能够实现复数的加减运算,classcomplexpublic:complex(doubler=0.0,doublei=0.0)real=r;imag=i;friendcomplexoperator+(complexc1,complexc2);/重载为友元函数complexoperator-(complexc1);/重载为成员函数voiddisplay();/显示复数的值private:/私有数据成员doublereal;doubleimag;,跳回,complexoperator+(complexc1,complexc2)/运算符重载友元函数实现returncomplex(c2.real+c1.real,c2.imag+c1.imag);complexcomplex:operator-(complexc1)/运算符重载成员函数实现returncomplex(real-c1.real,imag-c1.imag);voidcomplex:display()cout(real,imag)endl;,注意:重载为类的成员函数,操作对象个数少一,voidmain()/主函数complexc1(5,4),c2(2,10),c3;/声明复数类的对象coutc1=;c1.display();coutc2=;c2.display();c3=c1-c2;/使用重载运算符完成复数减法coutc3=c1-c2=;c3.display();c3=c1+c2;/使用重载运算符完成复数加法coutc3=c1+c2=;c3.display();,程序运行结果:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14),请看一个对此例改装的例子,补充例子,#includeiostream.hstructcomplexdoublereal;doubleimag;/friendcomplexoperator+(complexc1,complexc2);/complexoperator+(complexc1,complexc2);/重载为友元函数complexoperator+(complexc1,complexc2)complexc3;c3.imag=c1.imag+c2.imag;c3.real=c1.real+c2.real;returnc3;,voidmain()/主函数complexc1,c2,c3;/声明复数结构体变量c1.imag=1;c2.imag=2;c1.real=3;c2.real=4;c3=c1+c2;/使用重载运算符完成复数加法coutc3=c1+c2endl;coutc3.image=:c3.imagendl;coutc3.real=:c3.real=60)Minute=Minute-60;Hour+;Hour=Hour%24;cout=60)Minute=Minute-60;Hour+;Hour=Hour%24;coutClock+:;,/其它成员函数的实现略voidmain()ClockmyClock(23,59,59);coutFirsttimeoutput:;myClock.ShowTime();myClock+;myClock.ShowTime();+myClock;myClock.ShowTime();,程序运行结果为:Firsttimeoutput:23:59:59Clock+:0:0:0+Clock:0:0:1,不可以重载C+中的运算符:.、.*、?:、:、sizeof只能重载C+语言中已有的运算符,不可臆造新的。不改变原运算符操作数个数、优先级和结合性。,注意(6点):,有一定的原因,C+系统对重载运算符的选择,遵循函数重载的原则经重载的运算符,其操作数中至少应该有一个是自定义类型。运算符重载是对已有的运算符赋予多重含义,返回,虚函数,虚函数设计思想:为了实现类族中多个对象运行时的多态,对比虚基类:为了解决继承中产生的二义性问题,什么是二义性问题,慢慢体会,虚函数的定义格式,定义:基类中将某一成员函数用virtural声明派生类中用函数原型相同的函数超越、覆盖(overriding)它,对比重载(overloaded),classbaseAvirtualvoidf().classderiveB:publicbaseAvoidf(),例1:,#includeclassB0/基类B0声明public:/外部接口virtualvoiddisplay()coutB0:display()endl;/虚成员函数;,虚函数,classB1:publicB0/公有派生public:voiddisplay()coutB1:display()endl;classD1:publicB1/公有派生public:voiddisplay()coutD1:display()display();voidmain()B0b0,*p;/声明基类对象和指针B1b1;/声明派生类对象D1d1;/声明派生类对象p=/调用派生类D1函数成员,程序运行结果为:B0:display()B1:display()D1:display(),跳回,/抽象类定义classvehiclepublic:vehicle(floatspeed,inttotal)/构造函数vehicle:speed=speed;vehicle:total=total;virtualvoidshowmember()=0;/纯虚函数的定义protected:floatspeed;inttotal;,例2:,classcarpublic:vehicle/抽象类派生类public:/派生类的构造函数,实现基类的构造函数car(intaird,floatspeed,inttotal):vehicle(speed,total)car:aird=aird;virtualvoidshowmember()/派生类函数重载coutspeed1total2endl;protected:intaird;,调用如下:intmain(void)carb(250,150,4);b.showmember();return0;,什么情况下需要使用纯虚函数?,要在基类中抽象出一个方法,且该类被继承而不能被实例化时。基类的方法必须在派生类中被实现时。多个对象具有公共的抽象属性,但却有不同的实现要求时。,虚函数小结:,注意(6点):,虚函数是非静态成员函数;是动态联编的基础虚函数具有传递继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数在类的声明中,在函数原型之前写virtual,不能用在函数实现(定义)时。,无需为整个类的对象共享,本质:不是重载而是覆盖。调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。构造函数不能是虚函数,析构函数可以是虚函数/参考书上P265例8.5,返回,抽象类纯虚函数,带有纯虚函数的类称为抽象类class类名virtual类型函数名(参数表)=0;/纯虚函数.,纯虚函数的定义格式,定义纯虚函数的目的:和虚函数类似,与Java中的接口类类似,并且对于本类不定义其函数体,举例:,#includeclassB0/抽象基类b0声明public:/外部接口virtualvoiddisplay()=0;/纯虚函数成员;,对比:voidf(),classB1:publicB0/公有派生public:voiddisplay()coutB1:display()endl;/虚成员函数;classD1:publicB1/公有派生public:voiddisplay()coutD1:display()display();voidmain()/主函数B0*p;/声明抽象基类指针B1b1;/声明派生类对象D1d1;/声明派生类对象p=/调用派生类D1函数成员,程序的运行结果为:B1:display()D1:display(),注意:,抽象类是类的抽象抽象的抽象对于暂时无法定义的函数,可以声明为纯虚函数,给派生类去实现。抽象类只能作为基类来使用、不能声明抽象类的对象。可以定义抽象的指针或引用来指向其派生类的对象,访问其派生类函数成员从而体现多态的特征,返回,行为的抽象,多态的含义,重载多态强制多态包含多态参数多态,函数模板、类模板,本章

温馨提示

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

评论

0/150

提交评论