版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 多态,问题的提出 多态在本章的表现形式 总结与建议,头说:大家去工作吧,1.多态定义:不同类型的对象接收同样的消息产生不同的行为 2.现实需要多态;面向对象需要多态:它以归整划一的方式在特定时刻处理多个类型不同的对象,返 回,运算符重载 虚函数 抽象类纯虚函数,多态在本章主要的表现形式,返 回,运算符重载,设计思想 运算符重载的基本形式 运算符重载的实例 注意事项,返 回,运算符重载设计思想,扩展系统已有运算符的功能,能处理自定义数据类型 定义与特定运算符同名的函数 此函数与类相关联(成员或友元) 以函数处理特定的自定义数据类型 C系统通过函数重载的方式来定位、执行此特殊函数,返 回,
2、运算符重载分类,运算符重载,按载体,类的成员函数 类的友元函数,按对象个数,重载单目运算符:前置与后置 重载双目运算符,返 回,可以重载为普通函数吗?看完所有例子再回答,呵呵!,重载分类之一,重载为类成员函数 参数个数 = 原操作数个数 1(后置+、-除外) 重载为友元函数 参数个数 = 原操作数个数,且至少应该有一个自定义类型的形参,要理解参数个数的原因,格式,重载为类成员函数格式: 函数类型 operator 运算符(形参) . ,重载为友元函数格式 friendly 函数类型 operator 运算符(形参) . ,返 回,Operator:重载关键字,重载分类之二,单目运算符,前置单目
3、运算符: U oprd 无形参,表达式 U oprd 相当于 oprd.operator U( ) 后置单目运算符 oprd U 有一个 int 类型形参表达式 oprd+ 相当于 oprd.operator +(0),oprd 为特定的对象,重载分类之二,oprd1、 oprd2 为特定类的对象,双目运算符B: 重载后:表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2),返 回,重载举例1用“+”、“-”能够实现复数的加减运算,class complex public: complex(double r=0.0,double i=0.0) real=r
4、; imag=i; friend complex operator + (complex c1,complex c2);/重载为友元函数 complex operator - (complex c1);/重载为成员函数 void display();/显示复数的值 private:/私有数据成员 double real; double imag; ;,跳 回,complex operator +(complex c1,complex c2)/运算符重载友元函数实现 return complex(c2.real+c1.real, c2.imag+c1.imag); complex complex
5、: operator -(complex c1)/运算符重载成员函数实现 return complex(real-c1.real, imag-c1.imag); void complex:display() cout(real,imag)endl; ,注意:重载为类的成员函数,操作对象个数少一,void main() /主函数 complex c1(5,4),c2(2,10),c3; /声明复数类的对象 coutc1=; c1.display(); coutc2=; c2.display(); c3=c1-c2;/使用重载运算符完成复数减法 coutc3=c1-c2=; c3.display(
6、); c3=c1+c2;/使用重载运算符完成复数加法 coutc3=c1+c2=; c3.display(); ,程序运行结果: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14),请看一个对此例改装的例子,补充例子,#include iostream.h struct complex double real; double imag; /friend complex operator +(complex c1,complex c2); ; /complex operator + (complex c1,complex c2);/重载为友元函数
7、 complex operator +(complex c1,complex c2) complex c3; c3.imag=c1.imag+c2.imag; c3.real=c1.real+c2.real; return c3; ,void main() /主函数 complex c1,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.realendl;
8、,执行结果:,你明白了什么? 函数一定要重载成友元或者成员函数么?,重载举例2重载“+ + ”、“- -”,class Clock/时钟类声明 public:/外部接口 Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime( ); void operator +( ); /前置单目运算符重载 void operator +(int); /后置单目运算符重载 private:/私有数据成员 int Hour, Minute, Second; ;,操作数是时钟类的对象。 实现时间增加1秒钟。,void Clock:operator +(
9、)/前置单目运算符重载函数 Second+; if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; cout+Clock: ; ,逢六十进一,void Clock:operator +(int) /后置单目运算符重载 Second+; if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; coutClock+: ; ,/其它成员函
10、数的实现略 void main( ) Clock myClock(23,59,59); coutFirst time output:; myClock.ShowTime( ); myClock+; myClock.ShowTime( ); +myClock; myClock.ShowTime( ); ,程序运行结果为: First time output:23:59:59 Clock+: 0:0:0 +Clock: 0:0:1,不可以重载C+中的运算符: . 、 . *、 ? :、 :、 sizeof 只能重载C+语言中已有的运算符,不可臆造新的。 不改变原运算符操作数个数、优先级和结合性。,
11、注意(6点):,有一定的原因,C+系统对重载运算符的选择,遵循函数重载的原则 经重载的运算符,其操作数中至少应该有一个是自定义类型。 运算符重载是对已有的运算符赋予多重含义,返 回,虚函数,虚函数设计思想:为了实现类族中多个对象运行时的多态,对比虚基类:为了解决继承中产生的二义性问题,什么是二义性问题,慢慢体会,虚函数的定义格式,定义:基类中将某一成员函数用virtural 声明 派生类中用函数原型相同的函数超越、覆盖(overriding)它,对比重载(overloaded),class baseA virtual void f(). class deriveB:public baseA v
12、oid f() ,例1:,#include class B0/基类B0声明 public:/外部接口 virtual void display( ) coutB0:display( )endl; /虚成员函数 ;,虚函数,class B1: public B0/公有派生 public: void display( ) coutB1:display( )endl; ; class D1: public B1/公有派生 public: void display( ) coutD1:display( )endl; ;,void fun(B0 *ptr)/普通函数 ptr-display( ); vo
13、id main( ) B0 b0, *p; /声明基类对象和指针 B1 b1;/声明派生类对象 D1 d1;/声明派生类对象 p=/调用派生类D1函数成员 ,程序运行结果为: B0:display( ) B1:display( ) D1:display( ),跳 回,/抽象类定义 class vehicle public: vehicle (float speed, int total) /构造函数 vehicle:speed=speed; vehicle:total=total; virtual void showmember()=0; /纯虚函数的定义 protected: float s
14、peed; int total; ;,例2:,class car public : vehicle /抽象类派生类 public: /派生类的构造函数,实现基类的构造函数 car(int aird, float speed, int total):vehicle(speed,total) car:aird=aird; virtual void showmember() /派生类函数重载 coutspeed1total2endl; protected: int aird; ;,调用如下: int main(void) car b(250,150,4); b.showmember(); retur
15、n 0; ,什么情况下需要使用纯虚函数?,要在基类中抽象出一个方法,且该类被继承而不能被实例化时。 基类的方法必须在派生类中被实现时。 多个对象具有公共的抽象属性,但却有不同的实现要求时。,虚函数小结:,注意(6点):,虚函数是非静态成员函数;是动态联编的基础 虚函数具有传递继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数 在类的声明中,在函数原型之前写virtual,不能用在函数实现(定义)时。,无需为整个类的对象共享,本质:不是重载而是覆盖。 调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。 构造函数不能是虚函数,析构函数可以是虚函
16、数/参考书上P265 例8.5,返 回,抽象类纯虚函数,带有纯虚函数的类称为抽象类 class 类名 virtual 类型 函数名(参数表)=0; /纯虚函数. ,纯虚函数的定义格式,定义纯虚函数的目的:和虚函数类似,与Java中的接口类类似,并且对于本类不定义其函数体,举例:,#include class B0 /抽象基类b0声明 public: /外部接口 virtual void display( )=0; /纯虚函数成员 ;,对比:void f() ,class B1: public B0/公有派生 public: void display( )coutB1:display( )end
17、l; /虚成员函数 ; class D1: public B1/公有派生 public: void display( )coutD1:display( )endl; /虚成员函数 ;,void fun(B0 *ptr)/普通函数 ptr-display( ); void main( )/主函数 B0 *p;/声明抽象基类指针 B1 b1;/声明派生类对象 D1 d1;/声明派生类对象 p=/调用派生类D1函数成员 ,程序的运行结果为: B1:display( ) D1:display( ),注意:,抽象类是类的抽象抽象的抽象 对于暂时无法定义的函数,可以声明为纯虚函数,给派生类去实现。 抽象类只能作为基类来使用、不能声明抽象类的对象。 可以定义抽象的指针或引用来指向其派生类的对象, 访问其派生类函数成员从而体现多态的特征,返 回,行为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐厅员工奖惩制度范本
- 养生馆理疗师奖惩制度
- 承包商管理奖惩制度范本
- 卫生室奖惩制度实施细则
- 医院住院病历奖惩制度
- 幼儿园生评比与奖惩制度
- 住院医师教学奖惩制度
- 房产销售部业绩奖惩制度
- 福建省三比一看奖惩制度
- 员工消防奖惩制度
- 随机过程十四布朗运动
- 营养支持讲课最终课件
- 肩关节X线检查
- 出口海运工厂集装箱货物绑扎加固指南
- 电动机检修作业指导书
- TS30测量机器人Geocom中文说明书
- 化工厂监控系统解决方案
- GB/T 3565.1-2022自行车安全要求第1部分:术语和定义
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- GB/T 15382-2021气瓶阀通用技术要求
- 公共管理核心与前沿课件
评论
0/150
提交评论