程序设计基础第10章(08级)_第1页
程序设计基础第10章(08级)_第2页
程序设计基础第10章(08级)_第3页
程序设计基础第10章(08级)_第4页
程序设计基础第10章(08级)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、0,第10章多态性与虚函数,1.多态性概述2.运算符重载3.虚函数4.纯虚函数与抽象类5.程序设计举例,1,10.1多态性概述,多态性面向对象程序设计的关键技术之一。利用多态性技术,可以调用同名函数,实现完全不同的功能分类:(1)编译时的多态性:通过函数的重载和运算符的重载来实现的。(2)运行时的多态性:是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的,2,编译时多态性函数重载,classApublic:voidf(inta).voidf(floatb).;,intmain()At;inta=

2、1;floatb=3.0;t.f(a);t.f(b);.,3,10.2运算符重载,1.重载运算符主要用于对类的对象的操作2.重载运算符使得运算符适用的对象类型得到了拓宽3.重载运算符可以通过创建运算符函数实现,创建operator函数格式如下:类型类名:operator操作符()4.重载的运算符作为类的成员函数,或作为类的友元函数,4,例10.1定义一个复数类,并重载加法运算符以适应对复数运算的要求。,#includeclassComplexdoublereal,imag;public:Complex(doubler=0,doublei=0):real(r),imag(i)doubleReal

3、()returnreal;doubleImag()returnimag;Complexoperator+(Complex,5,ComplexComplex:operator+(Complex,6,ComplexComplex:operator+(doubled)/重载复数加一个实数运算符Complextemp;temp.real=real+d;temp.imag=imag;returntemp;Complexoperator=(Complexc)/用友元重载赋值运算符Complextemp;temp.real=c.real;temp.imag=c.imag;returntemp;,7,/测试主

4、函数,intmain()Complexc1(3,4),c2(5,6),c3;coutc1=c1.Real()+ic1.Imag()endl;coutc2=c2.Real()+ic2.Imag()endl;c3=c1+c2;/对象(复数)加对象(复数)coutc3=c3.Real()+ic3.Imag()endl;c3=c3+6.5;/对象(复数)加实数coutc3+6.5=c3.Real()+ic3.Imag()endl;return0;,8,C+中不允许重载的运算符,9,运算符重载的限制不能改变运算符的优先级及结合性;不能改变运算符的操作数个数;不能创建新的运算符,只有已有的运算符可以重载;

5、运算符原有的含义不变;重载的运算符函数不能带有默认参数;注意有些运算符只能重载为成员函数;,10,10.3虚函数,classPet/基类public:virtualvoidSpeak()cout“zzz”endl;/虚函数;classCat:publicPet/派生类public:virtualvoidSpeak()coutmiao!miao!endl;classDog:publicPet/派生类public:virtualvoidSpeak()coutwang!wang!endl;,例改写前面的例子,11,intmain()Petobj,*p1;/基类对象指针p1,基类对象objDogdog

6、1;Catcat1;obj=dog1;/用Dog类对象给Pet类对象赋值obj.Speak();p1=,12,运行时的多态性举例(类定义同前):voidmain()inti;Pet*p;Dogdog1;Catcat1;cini;if(i=1)p=/编译时不能确定,13,一、虚函数的定义,定义:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数语法:virtual函数返回类型函数名(参数表)函数体用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数(统一接口)注意:在派生类中重新定义虚函数时,其函数名、参数个数、类型及返回值类型都必须相同,14,二、虚函

7、数的使用限制,1.通常只将基类中的public或protected成员声明为虚函数。2.可以通过对象名.、指针或引用调用虚函数;3.基类中声明的虚函数会自动向派生类继承,在派生类中重定义的基类虚函数仍为虚函数,同时可以省略virtual关键字。4.如果派生中没有对基类的虚函数重新定义,则它继承基类中的虚函数。5.不能定义虚构造函数,可以定义虚析构函数6.不能将虚函数声明为静态的或全局的;友元不能作为虚函数,15,classPet/基类public:virtualvoidSpeak()coutzzzendl;classCat:publicPet/派生类public:voidSpeak()cout

8、miao!miao!endl;classDog:publicPet/派生类public:voidSpeak()coutwang!wang!endl;voidfun(Pet,例虚函数举例,16,intmain()Petobj;Dogdog1;Catcat1;obj=dog1;fun(obj);fun(cat1);fun(dog1);Pet,17,10.4纯虚函数与抽象类,问题:某个类的对象没有意义,如何防止用户创建此类对象?例:classPetpublic:virtualvoidSpeak();解决办法:纯虚函数,18,virtual返回类型函数名(参数表)=0;例:virtualvoidSpe

9、ak()=0;注:一般来说,纯虚函数没有实现部分;,1.定义格式,19,2.抽象类,(1)定义至少包含一个纯虚函数的类称为抽象类(2)使用抽象类的要求抽象类不能实例化抽象类只作为基类被继承可以定义指向抽象类的指针或引用,20,例抽象宠物类的实现,classPet/基类charName20;intAge;charColor12;public:Pet(char*,int,char*);char*GetName()returnName;intGetAge()returnAge;char*GetColor()returnColor;virtualvoidSpeak()=0;/纯虚函数声明virtual

10、voidGetInfo()/虚函数声明;Pet:Pet(char*name,intage,char*color)strcpy(Name,name);Age=age;strcpy(Color,color);,21,classCat:publicPet/派生类Catpublic:Cat(char*name,intage,char*color):Pet(name,age,color)voidSpeak()cout“miao!miao!”endl;/具体化纯虚函数voidGetInfo();/重新调整虚函数的功能;voidCat:GetInfo()/重新调整虚函数的功能coutThecatsname:

11、GetName()endl;coutThecatsage:GetAge()endl;coutThecatscolor:GetColor()endl;,22,classDog:publicPet/派生类Dogpublic:Dog(char*name,intage,char*color):Pet(name,age,color)voidSpeak()coutSoundofspeak:wang!wang!endlendl;/具体化纯虚函数voidGetInfo();/重新调整虚函数的功能;voidDog:GetInfo()/重新调整虚函数的功能coutThedogsname:GetName()endl

12、;coutThedogsage:GetAge()endl;coutThedogscolor:GetColor()endl;,23,intmain()Pet*p1;/基类对象指针p1p1=newCat(“MiKey”,1,“Blue”);/动态产生一个Cat类对象p1-GetInfo();p1-Speak();deletep1;/撤消p1所指对象p1=newDog(BenBen,2,Black);/动态产生一个Dog类对象p1-GetInfo();p1-Speak();deletep1;/撤消p1所指对象return0;,24,程序设计举例,例10.2抽象宠物类的另一种用法#includecla

13、ssPet/宠物基类public:virtualvoidSpeak()=0;voidShowMe();voidPet:ShowMe()cout我的声音:;Speak();,25,classCat:publicPet/派生类public:virtualvoidSpeak()coutmiao!miao!endl;classDog:publicPet/派生类public:virtualvoidSpeak()coutwang!wang!endl;voidmain()Catcat1;Dogdog1;cat1.ShowMe();dog1.ShowMe();,26,例10.3从Point、Circle类中抽

14、象出基类Shape,研究抽象类和具体类的接口和实现。,/shape.h文件定义抽象基类Shape#ifndefSHAPE_H#defineSHAPE_H#includeclassShapepublic:virtualdoubleArea()constreturn0.0;/纯虚函数,在派生类中重载virtualvoidPrintShapeName()const=0;virtualvoidPrint()const=0;#endif,27,/point.h文件定义类Point,#ifndefPOINT_H#definePOINT_H#includeshape.hclassPoint:publicSh

15、apeintx,y;/点的x和y坐标public:Point(int=0,int=0);/构造函数voidSetPoint(int,int);/设置坐标intGetX()returnx;/取x坐标intGetY()returny;/取y坐标virtualvoidPrintShapeName()constcoutPoint:;virtualvoidPrint()const;/输出点的坐标;#endif,28,/Point.cpp文件Point类的成员函数定义,#include#includepoint.hPoint:Point(inta,intb)SetPoint(a,b);voidPoint:

16、SetPoint(inta,intb)x=a;y=b;voidPoint:Print()constcoutx,y;,29,/circle.h定义类Circle,#ifndefCIRCLE_H#defineCIRCLE_H#include#includepoint.hclassCircle:publicPointdoubleradius;public:Circle(intx=0,inty=0,doubler=0.0);voidSetRadius(double);/设置半径doubleGetRadius()const;/取半径virtualdoubleArea()const;/计算面积virtua

17、lvoidPrint()const;/输出圆心坐标和半径virtualvoidPrintShapeName()constcoutCircle:;#endif,30,/circle.cpp文件circle类的成员函数定义,#includecircle.hCircle:Circle(inta,intb,doubler):Point(a,b)SetRadius(r);voidCircle:SetRadius(doubler)radius=(r=0?r:0);doubleCircle:GetRadius()constreturnradius;doubleCircle:Area()constreturn

18、3.14159*radius*radius;voidCircle:Print()constcoutCenter=;Point:Print();cout;Radius=radiusendl;,31,/Rectangle.h文件定义类Rectangle,#ifndefRECTANGLE_H#defineRECTANGLE_H#include#includepoint.hclassRectangle:publicPointdoublelength,width;public:Rectangle(intx=0,inty=0,doublel=0.0,doublew=0.0);voidSetLength(d

19、ouble);/设置长度voidSetWidth(double);/设置宽度doubleGetLength()const;/取长度doubleGetWidth()const;/取宽度virtualdoubleArea()const;/计算面积virtualvoidPrint()const;/输出坐标和尺寸virtualvoidPrintShapeName()constcoutRectangle:;#endif,32,/Rectangle.cpp文件Rectangle类的成员函数定义,#includeRectangle.hRectangle:Rectangle(inta,intb,doublel

20、,doublew):Point(a,b)SetLength(l);SetWidth(w);voidRectangle:SetLength(doublel)length=(l=0?l:0);voidRectangle:SetWidth(doublew)width=(w=0?w:0);doubleRectangle:GetLength()constreturnlength;doubleRectangle:GetWidth()constreturnwidth;,33,doubleRectangle:Area()constreturnlength*width;voidRectangle:Print()constcoutLeftTopVertex=;Point:Print();cout;Length=length,Wigth=widthendl;,34,/主程序.c

温馨提示

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

评论

0/150

提交评论