C++程序设计 连卫民 主编 第11章 类多态的程序设计

上传人:w****i 文档编号:94557769 上传时间:2019-08-08 格式:PPT 页数:45 大小:451KB
返回 下载 相关 举报
C++程序设计 连卫民 主编 第11章 类多态的程序设计_第1页
第1页 / 共45页
C++程序设计 连卫民 主编 第11章 类多态的程序设计_第2页
第2页 / 共45页
C++程序设计 连卫民 主编 第11章 类多态的程序设计_第3页
第3页 / 共45页
C++程序设计 连卫民 主编 第11章 类多态的程序设计_第4页
第4页 / 共45页
C++程序设计 连卫民 主编 第11章 类多态的程序设计_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《C++程序设计 连卫民 主编 第11章 类多态的程序设计》由会员分享,可在线阅读,更多相关《C++程序设计 连卫民 主编 第11章 类多态的程序设计(45页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计,连卫民 主编,中国铁道出版社 2008.9,第11章 类多态的程序设计,本章主要内容: 11.1 类多态概述 11.2 函数重载(重点) 11.3 运算符重载(重点) 11.4 静态联编和动态联编(重点) 11.5 虚函数(重点) 11.6 纯虚函数和抽象类 11.7 上机实训 本章教学目标: 了解在C+程序设计中多态性的两种不同体现 熟悉虚函数和抽象类的引入环境以及C+多态性的设计思想 掌握函数重载和运算符重载的原则和方法以及虚函数和抽象类在程序中的设计方法和步骤,11.1 类多态概述,11.1.1 类多态的概念 多态性是面向对象程序设计的重要特征之一。面向对象程序设计的特征包

2、括:抽象性、封装性、继承性和多态性,其中抽象是核心,封装是基础,继承是关键,多态是补充。多态一般存在于继承的环境中。 所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。这是面向对象程序设计的重要特征。如果一个语言只支持类而不支持多态是不能被称为面向对象语言的,只能说是基于对象的,如Ada、VB就属于此类。C+语言是支持多态的,利用多态性技术,可以调用同名的函数,实现完全不同的功能。,第11章 类多态的程序设计,11.1 类多态概述,11.1.2 类多态的分类 从系统实现的角度看,在C+中有两种多态性:静态多态性和动态多态性。 静态多态性是指在程序编译时系统就确定了要调用的函数。所以静

3、态多态性也称为编译时的多态性,它是通过函数的重载和运算符的重载实现的。 动态多态性也称为运行时的多态性,它是指在程序执行前,系统无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定要调用的函数。它是通过类的继承关系和虚函数的动态联编实现的,目的是建立一种通用的程序。,第11章 类多态的程序设计,11.2 函数重载,函数重载是指同一个函数名对应着多个不同的函数实现,即在C+中可以定义和使用同名的多个函数,它属于静态多态性。 本节主要介绍函数重载的两种类型: 函数参数类型重载 函数参数个数重载 11.2.1 函数参数类型重载 函数重载又称为函数的多态性,

4、是指同一个函数名对应着多个不同的函数。所谓“不同”是指这些函数的形参表必须互不相同,或者是形参的个数不同,或者是形参的类型不同,或者是两者都不相同,否则将无法实现函数重载。,第11章 类多态的程序设计,【例11-1】重载函数Cadd。 函数Cadd有两个功能,如果它的两个参数是char型的,那么函数Cadd将两者连接起来输出,如果它的两个参数的类型是double型的,那么函数Cadd将输出两者的和。,程序运行结果为: 连接后的字符串是:goodmorning 两数的和是:12.9,第11章 类多态的程序设计,程序代码如下: #include void Cadd(char *x,char *y)

5、 cout“连接后的字符串是:“xyendl; void Cadd(double x,double y) cout“两数的和是:“x+yendl; void main() Cadd(“good“,“morning“); Cadd(5.6,7.3); ,11.2 函数重载,11.2.2 函数参数个数重载 函数参数个数重载是指函数的参数个数不同,对函数进行重载。 【例11-2】 求若干个参数当中的最大值,根据参数个数的不同调用不同的max()函数。 分析:由于所求参数个数不确定,我们定义函数max()的参数个数也为可变值,若两次定义函数max(),分别包含两个参数x、y和三个参数x、y、z,可通过

6、参数个数的不同调用实现个数不定的数值比较。,11.2 函数重载,第11章 类多态的程序设计,11.2 函数重载,程序代码如下: #include float max(float x,float y) / 求两个实数的最大值 if(xy) return x; else return y; float max(float x,float y,float z) / 求三个实数的最大值 float b=max(x,y); return max(b,z); void main() coutmax(1,2)endl; coutmax(1,2,3); ,第5章 数组与指针,第10章 类继承的程序设计,第11

7、章 类多态的程序设计,程序运行结果为: 2 3,11.3 运算符重载,类的多态性还可以用运算符的重载实现,而运算符重载是面向对象程序设计的重要特征。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。 本节主要介绍运算符重载引入的目的、运算符重载的使用方法和应用实例。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,11.3.1 引入目的 在C+中预定义的运算符的操作对象只能是基本数据类型。实际上,对于很多用户自定义类型,也需要有类似的运算操作。 运算符是系统预先定义好的一些函数名称。所以,可以把运算符重载

8、看作是函数重载的一种特殊形式,对于运算符的重载和函数的重载是类似的,都是使同一个名称具有多重含义,它体现了面向对象的程序设计的多态性。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,11.3.2 运算符重载的使用 1运算符重载规则 (1)被重载的运算符虽然可以用来做任何事情,但是最好还是应使其新的功能与系统预先定义好的功能相似,以便使人容易理解。不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 (2)下面五个运算符不能重载:类属关系运算符“.”、成员指针运算符“*”、作用域分辨符“:”、sizeof运算符和三目运算符“?

9、:”。除此之外,C+的其他运算符都可以重载。 (3)被重载的运算符必须是系统预先定义好的运算符,即不能自己定义新的运算符。 运算符被重载后,不能改变优先级和结合性,也不能改变语法结构,即不能将单目运算符重载为双目运算符。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,2运算符重载为成员函数 把运算符重载为类的成员函数,可以在类中定义,也可以在类外定义。其格式为: 返回值类型名 类名:operator 运算符(参数表) 函数体 其中: “返回值类型”指定了运算符重载函数的运算结果类型; “类名”是重载此运算符的类名; “operator”是定义

10、运算符重载函数的关键字; “运算符”是要重载的运算符名称; “参数表”中给出了重载运算符所需要的参数和类型。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,【例11-3】复数类加法运算重载为成员函数形式。 程序代码如下: #include class Complex / 复数类定义 public: Complex(double r=0.0,double i=0.0)Real=r;Imag=i; Complex operator +(Complex c2); / 运算符+重载成员函数 void Display(); private: doubl

11、e Real; / 复数实部 double Imag; / 复数虚部 ;,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,Complex Complex:operator +(Complex c2) / 重载运算符函数定义 return Complex(Real+c2.Real,Imag+c2.Imag); void Complex:Display() cout“(“Real“,“Imag“)“endl; void main() Complex c1(10,60),c2(7,2),c3; / 复数类对象 cout“c1=“; c1.Displa

12、y(); cout“c2=“; c2.Display(); c3=c1+c2; / 使用重载运算符完成复数加法 cout“c3=c1+c2=“; c3.Display(); ,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,程序运行结果为: c1=(10,60) c2=(7,2) c3=c1+c2=(17,62),11.3 运算符重载,3运算符重载为友元函数 运算符也可以重载为类的友元函数,这样,它就可以自由地访问该类的任何数据成员。这时,运算所需要的操作数都需要通过函数的参数表来传递,在参数表中参数从左到右的顺序就是运算符操作数的顺序。 将运算符重载为类的友元函数

13、的声明格式为: friend 返回值类型名 类名:operator 运算符(参数表);,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,【例11-4】复数类加法运算重载为友元函数形式。 程序代码如下: #include class Complex / 复数类 public: Complex(double r=0.0,double i=0.0)Real=r;Imag=i; friend Complex operator+(Complex c1,Complex c2); /重载+为友元的声明 void Display(); private: dou

14、ble Real; / 复数实部 double Imag; / 复数虚部 ;,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.3 运算符重载,void Complex:Display() cout“(“Real“,“Imag“)“endl; Complex operator+(Complex c1,Complex c2) / 重载运算符函数定义 return Complex(c2.Real+c1.Real,c2.Imag+c1.Imag); void main() Complex c1(5,4),c2(2,10),c3; / 复数类对象 cout“c1=“;c

15、1.Display(); cout“c2=“;c2.Display(); c3=c1+c2; / 使用重载运算符完成复数加法 cout“c3=c1+c2=“; c3.Display(); ,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,程序运行结果为: c1=(5,4) c2=(2,10) c3=c1+c2=(7,14),11.3 运算符重载,将运算符重载为类的友元函数,就必须把操作数全部通过参数的方式传递给运算符重载函数。与例11-3相比,主函数一样,主要的变化在复数类的成员。程序的运行结果也完全相同。 说明: 运算符重载为成员函数时,仅有一个参数,另一个被隐含

16、。 运算符重载为友元函数时,不能隐含参数。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.4 静态联编和动态联编,11.4.1 静态联编 静态联编是指联编工作出现在编译连接阶段,也称为早期联编或静态束定。束定是确定程序中的操作调用与执行该操作代码间关系的过程。在编译和连接过程中,系统就可以根据类型匹配等特征确定程序中操作调用与执行该操作代码的关系,即确定了某一个同名标识到底是要调用哪一段程序代码。 静态联编可以通过函数重载和运算符重载来实现。,第5章 数组与指针,第10章 类继承的程序设计,第11章 类多态的程序设计,11.4 静态联编和动态联编,【例11-7】静态联编示例。 程序代码如下: #include class Point /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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