多态性

上传人:san****glu 文档编号:54721928 上传时间:2018-09-18 格式:PPT 页数:95 大小:856.50KB
返回 下载 相关 举报
多态性_第1页
第1页 / 共95页
多态性_第2页
第2页 / 共95页
多态性_第3页
第3页 / 共95页
多态性_第4页
第4页 / 共95页
多态性_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《多态性》由会员分享,可在线阅读,更多相关《多态性(95页珍藏版)》请在金锄头文库上搜索。

1、Chapter 5 多态性,本章主要内容,多态性 运算符重载 不同类型数据间的转换 虚函数,多态性(polymorphism)的概念,多态性是指同一个接口可以通过多种方法调用。通俗地说,多态性是指用一个相同的名字定义不同的函数,这些函数的执行过程不同,但是有相似的操作,即用同样的接口访问不同的函数。,面向对象的多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。,多态性(polymorphism)的概念,静态多态性与动态多态性,关联(binding,联编,绑定) 确定操作具体对象的过程。即程序自身不同部分彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。 静态

2、多态性(静态关联) 在编译的过程中确定同名操作的具体操作对象。即关联工作出现在编译阶段,用对象名或者类名来限定要调用的函数。 动态多态性(动态关联) 在程序运行过程中动态地确定操作所针对的具体对象。即关联工作在程序运行时执行,在程序运行时才确定将要调用的函数。,多态的实现,函数重载(静态关联) 运算符重载(静态关联)实质为函数重载。 虚函数(动态关联),本章主要内容,多态性 运算符重载 不同类型数据间的转换 虚函数,运算符重载主要内容,运算符重载概述 方法和规则 运算符重载函数作为类成员函数和友元函数 重载双目运算符、单目运算符 重载流插入运算符和流提取运算符,问题举例复数的运算,运算符重载,

3、class Complex /复数类声明 public: Complex(double r=0.0,double i=0.0) real=r; imag=i; Complex add (Complex ,如果有如下定义: Complex c1(1,1),c2(3,3) 希望两复数相加:c3=c1.add(c2);,能否直接通过 c1+c2 来实现?,问题举例复数的运算,运算符重载,class Complex /复数类声明 public: Complex(double r=0.0,double i=0.0) real=r; imag=i; Complex operator (Complex ,如

4、果有如下定义: Complex c1(1,1),c2(3,3) c1+c2 被解释为: c1.operator +(c2),问题举例点的运算,运算符重载,class Point private: int x,y; public: Point(int xx=0,int yy=0)x=xx;y=yy; ;,如果有如下定义: Point p1(1,1),p2(3,3) 希望两点相加:p1+p2,Point operator (Point ,运算符重载的实质,运算符重载是对已有的运算符赋予多重含义 必要性 C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。 实现机制

5、定义一个重载运算符的函数,在需要执行被重载的运算符时,把指定的运算表达式转化为对运算符函数的调用(系统自动调用)。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。 编译系统对重载运算符的选择,遵循函数重载的选择原则(根据实参的类型来确定需要调用的函数)。,运算符重载,重载确定的步骤,候选函数 选择可行函数 寻找最佳匹配,运算符重载,运算符重载概述 方法和规则 运算符重载函数作为类成员函数和友元函数 重载双目运算符、单目运算符 重载流插入运算符和流提取运算符,规则和限制,不能重载的运算符: . .* : sizeof ?: 只能重载C+语言中已有的运算符,不可定义新的运算

6、符。 不改变原运算符的优先级和结合性。 不能改变运算符运算对象(操作数)的个数,即单目运算符只能重载为单目运算符。 不能改变在原有类型的对象上的运算方式,运算符重载,规则和限制,重载运算符的函数不能有默认的参数。 经重载的运算符,其操作数中至少应该有一个是自定义类型。 用于类对象的运算符一般必须重载,但“”和“&”不必用户重载。 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。 运算符重载可以是类的成员函数,或友元函数,或普通函数。,运算符重载,重载的重要意义,运算符重载对C+有重要的意义,把运算符重载和类结合起来,可以在C+程序中定义出很有实用意义而使用方便的新的数据类

7、型。 运算符重载使C+具有更强大的功能、更好的可扩充性和适应性,这是C+最吸引人的特点之一。,运算符重载,运算符重载概述 方法和规则 运算符重载函数作为类成员函数和友元函数 重载双目运算符、单目运算符 重载流插入运算符和流提取运算符,运算符重载函数的两种形式,运算符函数可以是成员函数或全局函数,出于性能方面的考虑,全局函数通常指定为友元函数。,运算符重载,运算符重载函数的两种形式,重载为类成员函数。,运算符重载,函数类型 operator 运算符(形参) ,重载为友元函数。,friend 函数类型 operator 运算符(形参);,例如,想将“+”用于Complex类(复数)的加法运算, 函

8、数的原型可以是这样的: Complex operator+ (Complex,函数名(函数operator+重载了运算符+),运算符函数,重载为类成员函数时 参数个数=原操作数个数-1 (后置+、-除外) 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。,运算符重载,Complex Complex: operator+ (Complex,friend Complex operator+ (Complex,思考: 可以使用普通函数进行运算符重载吗?,只有在极少的情况下才使用既不是类的成员函数也不是友元函数的普通函数。 原因:普通函数不能直接访问类的私有成员。,运算符重

9、载,运算符重载概述 方法和规则 运算符重载函数作为类成员函数和友元函数 重载双目运算符、单目运算符 重载流插入运算符和流提取运算符,运算符成员函数的设计,双目运算符 U 如果要重载 U 为类成员函数,使之能够实现表达式 oprd1 U oprd2,其中 oprd1 为A 类对象,则 U应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。 经重载后,表达式 oprd1 U oprd2 相当于 oprd1.operator U(oprd2),重载为类成员函数,例 1,将“+”、“-”运算重载为复数类的成员函数。 规则: 实部和虚部分别相加减。 操作数: 两个操作数都是复数类的对象

10、。,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; /复数虚部 ;,重载为类成员函数,Complex Complex:operator +(Complex c2) /重载函数实现 Complex

11、 c; c.real=c2.real+real; c.imag=c2.imag+imag; return c; ,Complex Complex:operator -(Complex c2) /重载函数实现 return Complex(real-c2.real, imag-c2.imag); ,加减法是双目运算符,为什么重载函数中只有一个参数? 实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。,void main() Complex c1(5,4),c2(2,10),c3; cout“c1=“

12、; c1.display(); cout“c2=“; c2.display(); c3=c1-c2; /使用重载运算符完成复数减法 cout“c3=c1-c2=“; c3.display(); c3=c1+c2; /使用重载运算符完成复数加法 cout“c3=c1+c2=“; c3.display(); ,void Complex:display() cout“(“real“,“imag“)“endl; ,运行结果: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14),运算符友元函数的设计,如果需要重载一个运算符,使之能够用于操作某类对象的私有

13、成员,可以此将运算符重载为该类的友元函数。 有些运算符不能重载为友元,如“()”、“ ”、“-”以及任何的赋值运算符。 双目运算符 U重载后, 表达式oprd1 U oprd2 等同于operator U(oprd1,oprd2 ),重载为友元函数,例2,将+、-(双目)重载为复数类的友元函数。 两个操作数都是复数类的对象。,重载为友元函数,class Complex public: Complex(double r=0.0,double i=0.0) real=r; imag=i; friend Complex operator + (Complex c1,Complex c2); /运算符

14、+重载为友元函数 friend Complex operator - (Complex c1,Complex c2); /运算符-重载为友元函数 void display() cout“(“real“,“imag“)“endl; private: double real; double imag; ;,Complex operator +(Complex c1,Complex c2)/运算符重载友元函数 return Complex(c2.real+c1.real, c2.imag+c1.imag); Complex operator -(Complex c1,Complex c2)/运算符重

15、载友元函数 return Complex(c1.real-c2.real, c1.imag-c2.imag);,void main() Complex c1(5,4),c2(2,10),c3; cout“c1=“; c1.display(); cout“c2=“; c2.display(); c3=c1-c2; /使用重载运算符完成复数减法 cout“c3=c1-c2=“; c3.display(); c3=c1+c2; /使用重载运算符完成复数加法 cout“c3=c1+c2=“; c3.display(); ,两者的区别,c3=c2+i; Complex Complexoperator+(

16、int ,无法调用i.operator+,运算符重载函数作为成员函数,必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象,而且与运算符函数的类型相同。 如果左操作数必须是一个不同类的对象或者是一个基本类型对象,那么该运算符必须作为全局函数来实现。,重载一元运算符,回忆Time类. 若定义 Time myTime; +myTime;,重载为成员函数 class Time public: void operator+(); ; void Time:operator+() tick(); ,重载为友员函数 class Time public: friend void operator+(Time ,+myTime myTime.operator+(),

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号