欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第08章_多态性.ppt

    • 资源ID:84448083       资源大小:105KB        全文页数:42页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第08章_多态性.ppt

    第八章第八章 多态性多态性本章主要内容本章主要内容l多态性多态性l运算符重载运算符重载l虚函数虚函数l纯虚函数纯虚函数l抽象类抽象类第八章第八章 多态性多态性多态性的概念多态性的概念 多态性是面向对象程序设计的重要特征之一。多态多态性是面向对象程序设计的重要特征之一。多态性是指发出性是指发出同样的消息同样的消息被被不同类型的对象不同类型的对象接收时有可能接收时有可能导致导致完全不同的行为完全不同的行为。多态的实现:。多态的实现:p252l函数重载函数重载l运算符重载运算符重载l虚函数虚函数第八章第八章 多态性多态性8.1 运算符重载运算符重载 运算符重载是使同一个运算符作用于不同类型的数运算符重载是使同一个运算符作用于不同类型的数据时具有不同的行为。例如,我们声明了一个点类据时具有不同的行为。例如,我们声明了一个点类point和它的对象和它的对象point p1(1,1),p2(3,3),并并希望能希望能使用使用“+”运算符实现表达式运算符实现表达式“p1+p2”,就,就需要重载需要重载“+”运运算符。算符。运算符重载是实质上将运算对象转化为运算函数的运算符重载是实质上将运算对象转化为运算函数的实参,并根据实参的类型来确定重载的运算函数实参,并根据实参的类型来确定重载的运算函数。第八章第八章 多态性多态性1.只能重载只能重载C+中已有的运算符,不能臆造新的运算符;中已有的运算符,不能臆造新的运算符;2.类属关系运算符类属关系运算符“.”、作用域分辨符、作用域分辨符“:”、成员指针运算、成员指针运算符符“*”、sizeof运算符和三目运算符运算符和三目运算符“?:?:”不能重载。不能重载。3.重载之后运算符的优先级和结合性都不能改变,单目运算符重载之后运算符的优先级和结合性都不能改变,单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。只能重载为单目运算符,双目运算符只能重载为双目运算符。4.运算符重载后的功能应当与原有功能相类似。运算符重载后的功能应当与原有功能相类似。5.重载运算符含义必须清楚,不能有二义性。重载运算符含义必须清楚,不能有二义性。运算符的重载形式有两种:运算符的重载形式有两种:(1)重载为类的成员重载为类的成员函数函数;(2)重载为类的友元重载为类的友元函数函数。8.1.1 运算符重载的规则运算符重载的规则第八章第八章 多态性多态性运算符运算符重载重载为类的为类的友元函数友元函数的一般语法形式为:的一般语法形式为:friend operator (形参表形参表)函数体;函数体;其中:其中:(1)函数类型:重载运算符的返回值类型,即运算结果函数类型:重载运算符的返回值类型,即运算结果 类型;类型;(2)operator:定义运算符重载函数的定义运算符重载函数的关键字关键字。(3)运算符:要重载的运算符名称。运算符:要重载的运算符名称。(4)形参表:给出对象和类型。形参表:给出对象和类型。(5)friend:运算符重载为友元函数时的关键字。运算符重载为友元函数时的关键字。第八章第八章 多态性多态性1双目运算:双目运算:oprd1 B oprd2 把把B重载为重载为oprd1所属类的成员函数,只有一个形所属类的成员函数,只有一个形参,形参的类型是参,形参的类型是oprd2所属类所属类。例如,经过重载之后,。例如,经过重载之后,表达式表达式oprd1+oprd2就相当于函数调用就相当于函数调用oprd1.operator+(oprd2)。2单目运算单目运算1)前置单目运算:前置单目运算:U oprd 把把U重载为重载为oprd所属类的成员函数,没有形参。所属类的成员函数,没有形参。例如,例如,“+”重载的语法形式为:重载的语法形式为:operator +();+oprd 就就相当于函数调用相当于函数调用oprd.operator +();8.1.2 运算符重载为成员函数运算符重载为成员函数第八章第八章 多态性多态性2)后置单目运算后置单目运算 oprd V 运算符运算符V重载为重载为oprd所属类的成员函数,带有一所属类的成员函数,带有一个整型个整型(int)形参。例如,后置单目运算符形参。例如,后置单目运算符“-”重载的重载的语语法形式为:法形式为:operator-(int);oprd-就相当于函数调用就相当于函数调用oprd.operator-(0);第八章第八章 多态性多态性/EX8_1.cpp:演示重载二维点演示重载二维点point的的“+”、“-”运算符运算符#include class point private:float x,y;public:point(float xx=0,float yy=0)x=xx;y=yy;float get_x()return x;float get_y()return y;point operator+(point p1);/重载运算符重载运算符“+”point operator-(point p1);/和和“-”为成员函数为成员函数;第八章第八章 多态性多态性point point:operator+(point q)return point(x+q.x,y+q.y);point point:operator-(point q)return point(x-q.x,y-q.y);void main()point p1(3,3),p2(2,2),p3,p4;/声明声明point类的对象类的对象 p3=p1+p2;/两点相加两点相加 p4=p1-p2;/两点相减两点相减 coutp1+p2:x=p3.get_x(),y=p3.get_y()endl;coutp1-p2:x=p4.get_x(),y=p4.get_y()endl;第八章第八章 多态性多态性 可以看出,除了在函数声明及实现的时候使用了可以看出,除了在函数声明及实现的时候使用了关键字关键字operator之外,运算符重载成员函数与类的普之外,运算符重载成员函数与类的普通成员函数没有什么区别。在使用的时候,可以直接通成员函数没有什么区别。在使用的时候,可以直接通过运算符、操作数的方式来完成函数调用。通过运算符、操作数的方式来完成函数调用。程序运行结果为:程序运行结果为:p1+p2:x=5,y=5p1-p2:x=1,y=1第八章第八章 多态性多态性例例 时钟类时钟类运算符前置运算符前置+和后置和后置+重载为时钟类的成员函数。重载为时钟类的成员函数。前置单目运算符,重载函数没有形参,对于后置单目运前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要有一个整型形参。算符,重载函数需要有一个整型形参。操作数是时钟类的对象。操作数是时钟类的对象。实现时间增加实现时间增加1秒钟。秒钟。运算符重载第八章第八章 多态性多态性/8_2.cpp#includeusing namespace std;class Clock/时钟类声明时钟类声明 public:/外部接口外部接口 Clock(int NewH=0,int NewM=0,int NewS=0);void ShowTime();Clock&operator+();/前置单目运算符重前置单目运算符重载载 Clock operator+(int);/后置单目运算符重后置单目运算符重载载 private:/私有数据成员私有数据成员 int Hour,Minute,Second;第八章第八章 多态性多态性Clock&Clock:operator+()/前置单目运算符重载函数前置单目运算符重载函数 Second+;if(Second=60)Second=Second-60;Minute+;if(Minute=60)Minute=Minute-60;Hour+;Hour=Hour%24;return*this;13第八章第八章 多态性多态性Clock:Clock(int NewH,int NewM,int NewS)if(0=NewH&NewH24&0=NewM&NewM60&0=NewS&NewS60)Hour=NewH;Minute=NewM;Second=NewS;else coutTime error!endl;void Clock:ShowTime()coutHour:Minute:Secondendl;第八章第八章 多态性多态性Clock Clock:operator+(int)/后置单目运算符重载后置单目运算符重载/注意形参表中的整型参数注意形参表中的整型参数 Clock old=*this;+(*this);return old;void main()Clock myClock(23,59,59);coutFirst time output:;myClock.ShowTime();coutShow myClock+:;(myClock+).ShowTime();coutShow+myClock:;(+myClock).ShowTime();15第八章第八章 多态性多态性1.双目运算:oprd1 B oprd2 双目运算符双目运算符B重载为重载为oprd1所属类的友元函数,该类的友元函数,该函数有两个形参,表达式函数有两个形参,表达式oprd1 B oprd2就相当于函数就相当于函数调用调用operator B(oprd1,oprd2)。2单目运算1)前置单目运算前置单目运算U oprd 前置前置单目运算符单目运算符U重载为重载为oprd所属类的友元函数,所属类的友元函数,表达式表达式U oprd相当于函数调用相当于函数调用operator U(oprd)。2)后置单目运算后置单目运算oprd V 后置单目运算符后置单目运算符V重载为重载为oprd所属类的友元函数,所属类的友元函数,表达式表达式oprd V相当于函数调用相当于函数调用operator V(oprd,int)。8.1.3 运算符重载为友元函数运算符重载为友元函数第八章第八章 多态性多态性/EX8_2.cpp:/演示使用运算符重载为友元函数的方法重做两点加减法运算演示使用运算符重载为友元函数的方法重做两点加减法运算#include class point private:float x,y;public:point(float xx=0,float yy=0)x=xx;y=yy;float get_x()return x;float get_y()return y;friend point operator+(point p1,point p2);/重载重载“+”和和 friend point operator-(point p1,point p2);/“-”为友元为友元函数函数;第八章第八章 多态性多态性point operator+(point p1,point p2)return point(p1.x+p2.x,p1.y+p2.y);point operator-(point p1,point p2)return point(p1.x-p2.x,p1.y-p2.y);void main()point p1(3,3),p2(2,2),p3,p4;/声明声明point类的对象类的对象 p3=p1+p2;/两点相加两点相加 p4=p1-p2;/两点相减两点相减 coutp1+p2:x=p3.get_x(),=p3.get_y()endl;coutp1-p2:x=p4.get_x(),=p4.get_y()endl;程序运行结果:程序运行结果:p1+p2:x=5,y=5 p1-p2:x=1,y=1第八章第八章 多态性多态性1比较运算符重载例如,例如,、=、=和和!=。2赋值运算符重载 例如,例如,=、+=、-=、*=和和/=。这些运算符的重载比较简单。这些运算符的重载比较简单。8.1.4 其他运算符重载其他运算符重载第八章第八章 多态性多态性/EX8_3.cpp:演示比较运算符和赋值运算符重载的程序演示比较运算符和赋值运算符重载的程序#include class point private:float x,y;public:point(float xx=0,float yy=0)x=xx;y=yy;point(point&);point()bool operator=(point);bool operator!=(point);point operator+=(point);point operator-=(point);float get_x()return x;float get_y()return y;第八章第八章 多态性多态性point:point(point&p)x=p.x;y=p.y;bool point:operator=(point p)if(x=p.get_x()&y=p.get_y()return 1;else return 0;bool point:operator!=(point p)if(x!=p.get_x()&y!=p.get_y()return 1;else return 0;point point:operator+=(point p)this-x+=p.get_x();this-y+=p.get_y();return*this;第八章第八章 多态性多态性point point:operator-=(point p)this-x-=p.get_x();this-y-=p.get_y();return*this;void main()point p1(1,2),p2(3,4),p3(5,6);coutp1=p2?(p1=p2)endl;coutp1!=p2?(p1!=p2)endl;p3+=p1;coutp3+=p1,p3:p3.get_x(),p3.get_y()endl;p3-=p1;coutp-=p1,p3:p3.get_x(),p3.get_y()endl;第八章第八章 多态性多态性程序运行结果为:程序运行结果为:p1=p2?0p1!=p2?1p3+=p1,p3:6,8p3-=p1,p3:5,6第八章第八章 多态性多态性3 3下标运算符下标运算符 重载重载/EX8_4.cpp:演示下标运算符演示下标运算符 重载例题重载例题#include#include class word private:char *str;public:word(char*s)str=new char strlen(s)+1 ;strcpy(str,s);char&operator (int k)return *(str+k);void disp()cout str=0)wn-1=wn-1-32;n-;w.disp();程序运行结果为:程序运行结果为:chinachina CHINA CHINA第八章第八章 多态性多态性4 4运算符运算符newnew和和deletedelete重载重载/EX8_5.cpp:演示重载演示重载new和和delete的程序。其中的程序。其中new通过通过/malloc()函数实现,函数实现,new的操作数是申请内存单元的字节个的操作数是申请内存单元的字节个数。数。/delete通过通过free()函数实现,它的操作数是一个指针,即告诉函数实现,它的操作数是一个指针,即告诉/系统释放哪里的单元。系统释放哪里的单元。#include#include class rect private:int length,width;public:rect(int l,int w)length=l;width=w;第八章第八章 多态性多态性 void*operator new(size_t size)/size_t unsigned integer return malloc(size);void operator delete(void*p)free(p);void disp()coutarea:length*widthdisp();delete p;/程序运行结果为:程序运行结果为:area:45第八章第八章 多态性多态性5 5逗号运算符重载逗号运算符重载/EX8_6.cpp:演示重载逗号演示重载逗号“,”和加号和加号“+”运算符的程序运算符的程序#include#includeclass point private:int x,y;public:point();point(int xx,int yy)x=xx;y=yy;第八章第八章 多态性多态性 point operator,(point r)return r;point operator+(point r)point t;t.x=x+r.x;t.y=y+r.y;return t;void disp()coutarea:x*yendl;第八章第八章 多态性多态性void main()point p1(1,2),p2(3,4),p3(5,6);p1.disp();p2.disp();p3.disp();p1=(p1,p2+p3,p3);/返回右操作数返回右操作数p3的坐标的坐标 p1.disp();程序运行结果为:程序运行结果为:area:2area:12area:30area:30第八章第八章 多态性多态性8.2 8.2 虚函数虚函数 多态性多态性是一种实现是一种实现“一种接口,多种方法一种接口,多种方法”的技术,的技术,虚函数虚函数是是C+实现统一接口实现统一接口的途径:在基类中定义具的途径:在基类中定义具有有通用接口(泛化)通用接口(泛化)的虚函数,在派生类中将虚函数的虚函数,在派生类中将虚函数重载(特化)重载(特化)。4.4.1 虚函数的定义虚函数的定义1虚函数在基类中定义虚函数在基类中定义 虚函数的定义语法是:虚函数的定义语法是:virtual (形参表形参表)函数体函数体第八章第八章 多态性多态性/EX8_7.cpp:演示定义和访问虚函数演示定义和访问虚函数#include class base/定义基类定义基类base public:virtual void who()/虚函数声明虚函数声明 coutthis is the class of base!endl;class derive1:public base/定义派生类定义派生类derive1 public:void who()/重新定义虚函数重新定义虚函数 coutthis is the class of derive1!endl;第八章第八章 多态性多态性class derive2:public base/定义派生类定义派生类derive2 public:void who()/重新定义虚函数重新定义虚函数 coutthis is the class of derive2!who();/调用基类成员函数调用基类成员函数 ptr=&obj1;/基类指针指向派生类基类指针指向派生类1对象对象 ptr-who();/调用派生类调用派生类1成员函数成员函数 ptr=&obj2;/基类指针指向派生类基类指针指向派生类2对象对象 ptr-who();/调用派生类调用派生类2成员函数成员函数 return 1;第八章第八章 多态性多态性程序运行结果为:程序运行结果为:this is the class of base!this is the class of derive1!this is the class of derive2!如果在基类中去掉关键词如果在基类中去掉关键词virtual,则,则程序运行结果为:程序运行结果为:this is the class of base!this is the class of base!this is the class of base!第八章第八章 多态性多态性2 2虚函数与重载的关系虚函数与重载的关系 在派生类中重载一个在派生类中重载一个虚函数虚函数,要求,要求函数名函数名、返回类型返回类型、参数参数个数个数、参数类型参数类型以及以及参数的顺序参数的顺序都与基类中原型都与基类中原型完全相同完全相同,不能,不能有任何的不同。有任何的不同。而而一般一般的函数重载,只要的函数重载,只要函数名相同函数名相同即可,函数的返回类型即可,函数的返回类型及所带的参数可以不同。及所带的参数可以不同。8.2.2 虚函数的限制虚函数的限制设置虚函数须注意:设置虚函数须注意:(1)只有只有成员函数成员函数才能声明为虚函数。因为虚函数仅适用于有继才能声明为虚函数。因为虚函数仅适用于有继 承关系的类对象,所以普通函数不能声明为虚函数。承关系的类对象,所以普通函数不能声明为虚函数。(2)虚函数必须是虚函数必须是非静态非静态成员函数。这是因为静态成员函数不受成员函数。这是因为静态成员函数不受 限于某个对象。限于某个对象。第八章第八章 多态性多态性(3)内联函数内联函数不不能能声明为虚函数。因为内联函数不能在运声明为虚函数。因为内联函数不能在运 行中动态确定其位置。行中动态确定其位置。(4)构造函数构造函数不不能能声明为虚函数。多态是指不同的对象对声明为虚函数。多态是指不同的对象对 同一消息有不同的行为特性。同一消息有不同的行为特性。虚函数作为运行过程中虚函数作为运行过程中 多态的基础,主要是针对对象的多态的基础,主要是针对对象的,而,而构造函数是在对构造函数是在对 象产生之前运行的象产生之前运行的,因此,虚构造函数是没有意义的。,因此,虚构造函数是没有意义的。(5)析构函数可以析构函数可以声明为虚函数。析构函数的功能是在该声明为虚函数。析构函数的功能是在该 类对象消亡之前进行一些必要的清理工作,析构函数类对象消亡之前进行一些必要的清理工作,析构函数 没有类型,也没有参数,和普通成员函数相比,虚析没有类型,也没有参数,和普通成员函数相比,虚析 构函数情况略为简单些。构函数情况略为简单些。第八章第八章 多态性多态性虚析构函数的声明语法为:虚析构函数的声明语法为:virtual 类名类名例如:例如:class B public:virtual B();第八章第八章 多态性多态性 纯纯虚函数虚函数是一个在基类中是一个在基类中没有定义具体操作内容没有定义具体操作内容的虚函数,要求各派生类根据实际需要定义自己的实的虚函数,要求各派生类根据实际需要定义自己的实现内容。现内容。纯虚函数的声明形式为:纯虚函数的声明形式为:virtual (参数表参数表)=0 纯虚函数与一般虚函数成员的原型在书写形式上的不纯虚函数与一般虚函数成员的原型在书写形式上的不同就在于后面加了同就在于后面加了“=0”,表明在基类中不用定义该函,表明在基类中不用定义该函数数,它的实现部分(函数体)留给派生类去做。,它的实现部分(函数体)留给派生类去做。8.2.3 纯虚函数纯虚函数第八章第八章 多态性多态性 抽象类的主要作用是通过它为一个抽象类的主要作用是通过它为一个类类族族族族建立一个建立一个公公公公共共共共的接口的接口,使它们能够更有效地发挥多态特性。,使它们能够更有效地发挥多态特性。一个一个抽抽象象类至少带有一个类至少带有一个纯虚纯虚函数函数。使用抽象类时需注意以下几点:使用抽象类时需注意以下几点:(1)抽象类只能用作其他类的基类,抽象类只能用作其他类的基类,不能建立抽象类对不能建立抽象类对 象象。抽象类处于继承层次结构的较上层,一个抽象类。抽象类处于继承层次结构的较上层,一个抽象类 自身无法实例化,只能通过继承机制,生成抽象类的自身无法实例化,只能通过继承机制,生成抽象类的 非抽象派生类,然后再实例化。非抽象派生类,然后再实例化。(2)抽象类抽象类不能用作参数类型、函数返回值或显式转换的不能用作参数类型、函数返回值或显式转换的 类型类型。(3)可以声明一个抽象类的指针和引用。可以声明一个抽象类的指针和引用。8.2.4 抽象类抽象类第八章第八章 多态性多态性/EX8_8.cpp:演示抽象类和纯虚函数演示抽象类和纯虚函数#include const double PI=3.14159;class Shapes/抽象基类抽象基类Shapes声明声明 protected:int x,y;public:void setvalue(int xx,int yy=0)x=xx;y=yy;virtual void display()=0;/纯纯虚函数成员虚函数成员;class Rectangle:public Shapes/派生类派生类Rectangle声明声明 public:void display()/虚成员函数虚成员函数 coutThe area of rectangle is:x*yendl;第八章第八章 多态性多态性class Circle:public Shapes/派生类派生类Circle声明声明 public:void display()/虚成员函数虚成员函数 coutThe area of circle is:PI*x*xsetvalue(5,8);/设置矩形边长设置矩形边长 ptr0-display();/调用调用rect虚成员函数显示矩形面积虚成员函数显示矩形面积 ptr1=○/抽象基类指针指向抽象基类指针指向Circle类对象类对象 ptr1-setvalue(10);/设置圆形半径设置圆形半径 ptr1-display();/调用调用cir虚成员函数显示圆形面积虚成员函数显示圆形面积第八章第八章 多态性多态性 程序中类程序中类Shapes、Rectangle和和Circle属于同一属于同一个类族,抽象类个类族,抽象类Shapes通过纯虚函数为整个类族提供通过纯虚函数为整个类族提供了通用的外部接口。通过公有派生而来的子类,给出了通用的外部接口。通过公有派生而来的子类,给出了纯虚函数的具体函数体实现,因此是非抽象类。我了纯虚函数的具体函数体实现,因此是非抽象类。我们可以定义非抽象类的对象,同时根据赋值兼容规则,们可以定义非抽象类的对象,同时根据赋值兼容规则,抽象类抽象类Shapes类型的指针也可以指向任何一个派生类类型的指针也可以指向任何一个派生类的对象,通过基类的对象,通过基类Shapes的指针可以访问到正在指向的指针可以访问到正在指向的派生类的派生类Rectangle和和Circle类对象的成员,这样就实类对象的成员,这样就实现了对同一类族中的对象进行统一的多态处理。程序现了对同一类族中的对象进行统一的多态处理。程序运行结果为:运行结果为:The area of rectangle is:40The area of circle is :314.159

    注意事项

    本文(第08章_多态性.ppt)为本站会员(hwp****526)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开