




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 1页 第4章 多态性 4.1 多态性概述 多态性的概念:(polymorphisn) 是指多种表现形式,具体地说,就是把同样的消息发给不同类型 的对象后可能导致完全不同的行为,即“一个对外接口,对应多 个内在实现方法”。多态性连同前面所讲过的封装性和继承性一 起,构成了面向对象程序设计的三大基本特征。 多态性的实现: 函数重载 运算符重载 虚函数 从系统实现角度来看,多态性包括静态多态性(编译时多态 性)和动态多态性(运行时多态性)两大类。 静态多态性:是通过函数重载和类属机制来实现的。在程序 编译时系统就能确定调用哪个函数,因此静态函数又称编译时的 多态性。例如:函数重载和运算符重载就属于这种情况。 动态多态性:是通过虚函数、继承机制,以及动态绑定机制 来实现的。在程序运行过程中才动态地确定操作指针所指的对象 ,主要通过虚函数和重写来实现。 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 2页 4.2 运算符重载 4.2.1 运算符重载的概念 运算符重载:是指将同一个运算符作用于不同的运算对象时 ,可以实现不同的操作。其意义在于,使程序的表达方式更加 符合人们平时的表达习惯,易于接受。 运算符具有函数的特性,我们可以将一个运算符看成是一个 函数名,我们使用一个运算符,就相当于是在调用一个函数。 比如:3+2可以理解成+(3,2),即调用函数+,并给出两个实参3 和2。 为此,运算符重载和函数重载本质上就是相同的。 4.2.2 运算符重载的规则 1、有5种运算符不能重载,它们是类属关系运算符“.”,成 员指针运算符“*”,作用域分辨符“:”,sizeof运算符和条件运算 符“?:”。 2、重载后的运算符有四个“不能改变”:不能改变运算符原 有的优先级;不能改变运算符原有的结合性;不能改变运算符 原有的语法结构;不能改变运算符操作数的个数。 3、至少要有一个操作对象是自定义类型,否则就不必重载 了。 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 3页 4.2.3 运算符重载的语法 返回类型 类名:operator 操作符(形参表) 4.2.4 运算符重载的方法 1、用类成员函数实现运算符重载:其中=、 、( )、-等运 算符必须采用这种方法实现重载。 用类成员函数实现重载时,参数个数=原操作数个数-1(后 置+、-除外)。 比如:要重载一个双目运算符P为类成员函数,使之能够实 现表达式 oprd1 P oprd2的运算,其中 假定oprd1 为A 类的对象 ,则P就应该被重载为 A 类的成员函数,形参类型应该是oprd2 所属的类型。经重载后,执行表达式 oprd1 P oprd2就相当于是 执行oprd1.operatorP(oprd2)。 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 4页 又如:要重载前置单目运算符P为类成员函数,使之能够实 现表达式P oprd的运算,其中假定oprd 为A类的对象,则P就应 该被重载为 A 类的成员函数,没有形参。经重载后,执行表达 式P oprd就相当于执行oprd.operatorU( ) 。 再如:要重载后置单目运算符P(+或-)为类成员函数, 使之能够实现表达式 oprd P,其中假定oprd 为A类的对象,则 P就应该被重载为 A 类的成员函数,且具有一个int类型的形参 。经重载后,执行表达式oprd P就相当于执行oprd.operator P(0) 。这里的参数个数与重载前置单目运算符时不相同,以此 区分前置的P。 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 5页 4.2.5 运算符重载的例子 例1 请用类成员函数重载“+”、“-”两个双目运算符,使之可以用于复数 的运算。 #include using namespace std;/可用#include来替换 这两行 class complex /复数类声明 public: /外部接口 complex(double r=0.0,double i=0.0) real=r;imag=i; complex operator+ (complex c2); /+重载为成员函数 complex operator- (complex c2); /-重载为成员函数 void display(); /输出复数 private: /私有数据成员,自己内部使用 double real; /复数实部 double imag; /复数虚部 ; LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 6页 complex complex:operator+(complex c2) complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); complex complex:operator-(complex c2) complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); void complex:display() cout using namespace std; class Clock/定义一个时钟类 public: Clock(int NewH=0, int NewM=0, int NewS=0); void ShowTime(); Clock /前置单目运算符重载 Clock operator+(int); /后置单目运算符重载 private: int Hour,Minute,Second; ; LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 9页 Clock if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; return *this; /将这个被前置运算后的对象通过引用返回 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 10页 Clock Clock:operator +(int) /后置单目运算符重载函数 /注意形参表中的这个int参数,可以不写形参名,写了也 不用 Clock old=*this; +(*this); /调用前置单目运算符重载函数 return old; /其它成员函数的实现 Clock:Clock(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock:ShowTime() cout using namespace std; class complex public: complex(double r=0.0,double i=0.0) real=r; imag=i; friend complex operator+ (complex c1,complex c2); /运算符+被重载为本类的友元函数 friend complex operator- (complex c1,complex c2); /运算符-被重载为本类的友元函数 void display();/显示复数的值 private:/私有数据成员 double real; double imag; ; LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 15页 complex operator+(complex c1,complex c2) /友元函数实现运算符重载 return complex(c2.real+c1.real, c2.imag+c1.imag); complex operator-(complex c1,complex c2) /友元函数实现运算符重载 return complex(c1.real-c2.real, c1.imag-c2.imag); / 其他函数和主函数同例1 注意:这里的operator+和operator-是两个普通函数(非成员 函数)。 两种重载方法的比较: 一般说来,单目运算符最好被重载为成员函数;对双目运算 符最好被重载为友元函数,双目运算符重载为友元函数比重载 为成员函数更方便,但是,有的双目运算符还是重载为成员函 数为好,例如,赋值运算符。因为,它如果被重载为友元函数 ,将会出现与赋值语义不一致的地方。 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 16页 4.3 用虚函数实现多态性 4.3.1 绑定方式 绑定(binding):是指对于具有多种解释的名字,将名字 与它的某个含义相关联的过程。对于函数而言,就是将函数调 用与某个函数体对应起来。 根据进行关联的时机不同,可将绑定分为早期绑定(又称静 态绑定)和晚期绑定(又称动态绑定)。 静态绑定:绑定过程出现在编译阶段,在编译时就用对象名 或者类名来限定要调用的函数。 动态绑定:绑定过程出现在运行阶段,在程序运行时才确定 将要调用的函数。 在C+中,函数调用的默认绑定方式是静态绑定,只有通 过基类类型的引用或指针调用被指定为虚函数的成员函数时才 进行动态绑定,实现运行时多态性。 为此,可以看出,运行时多态性是通过虚函数、继承机制, 以及动态绑定机制来实现的。要实现运行时多态性必须同时满 足下面4个条件: LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 17页 要有一个继承层次; 在基类中要定义虚函数; 在公有派生类中要对基类中定义的虚函数进行重定义; 要通过基类指针(或基类引用)来调用虚函数。 4.3.2 虚函数 虚函数:是指在类定义体中使用保留字virtual来声明的成员 函数。这个含有虚函数的类,称为多态类。 注意: 1、virtual 只能用在类的声明中、函数原型之前,不能用在 函数实现时。 2、派生类对基类中的虚函数进行重定义,既不是要实现重 载也不是要实现隐藏,而是要实现覆盖。 例4 一个静态绑定的例子 LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 18页 #include using namespace std; class Point public: Point(double i, double j) x=i; y=j; double Area() const return 0.0; private: double x, y; ; class Rectangle:public Point public: Rectangle(double i, double j, double k, double l); double Area() const return w*h; private: double w,h; ; Rectangle:Rectangle(double i, double j, double k, double l) :Point(i,j) w=k; h=l; LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 19页 void fun(Point class Point public: Point(double i, double j) x=i; y=j; virtual double Area( ) const return 0.0; private: double x, y; ; class Rectangle:public Point public: Rectangle(double i, double j, double k, double l); virtual double Area( ) const return w*h; private: double w,h; ; Rectangle:Rectangle(double i, double j, double k, double l) :Point(i,j) w=k; h=l; LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 21页 void fun(Point class B0/基类B0声明 public: virtual void display() /虚成员函数 coutdisplay(); int main() B0 b0, *p; /声明基类指针p和对象b0 B1 b1; /声明派生类对象 D1 d1; /声明派生类对象 p= fun(p);/调用基类B0函数成员 p= fun(p);/调用派生类B1函数成员 p= fun(p);/调用派生类D1函数成员 运行结果: B0:display() B1:display() D1:display() LanJ copyright * 四川理工学院计算机学院 C+程序设计 第 24页 4、什么时候需要虚析构函数 如果某个类不包含虚函数时,那这个类一般不要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030儿童营养品市场发展现状与消费趋势预测及投资机会分析报告
- 2025-2030儿童职业体验馆场景创新与教育价值挖掘及运营效率提升报告
- 2025-2030儿童素质教育赛道资本布局与投资回报周期预测报告
- 2025-2030儿童生活技能教育市场发展现状及投资价值评估报告
- 交易行为合规规范声明书3篇
- 2025-2030儿童感统训练市场现状分析与未来发展潜力及投资风险评估报告
- 2025-2030儿童心理健康服务市场现状分析与发展战略及投资潜力研究报告
- 2025-2030儿童天文科普教育市场认知度与课程开发报告
- 财务透明度公司治理承诺书7篇
- 唐雎不辱使命阅读赏析:初中语文古文阅读理解教案
- (完整)中小学“学宪法、讲宪法”知识竞赛题库及参考答案
- 2025版防洪堤坝加固工程施工合同
- 智能培训系统构建
- 2025广东广州越秀区矿泉街招聘禁毒专职人员1人考试备考题库及答案解析
- DBJT15-147-2018 建筑智能工程施工、检测与验收规范
- 华为鸿蒙课件
- 全站仪使用课件
- 2025年成人高考专升本民法真题及答案
- 2024年云南省公务员考试行测真题参考答案详解
- 高血压防治知识课件下载
- 初中普法主题教育
评论
0/150
提交评论