- 2
- 0
- 约1.03万字
- 约 6页
- 2018-02-26 发布于江苏
- 举报
【计算机】6.1 重载与程序的多态性设计
第六章 多态性与虚函数
面向对象的封装性、继承性和多态性是OOP的三大基本支柱。本章将集中讨论类与对象的多态性概念、设计方法和技巧,这是软件系统能否控制给定对象完成所要求各种动作的能力问题。
本章目的:
.理解抽象类与多态性
.掌握虚函数概念和用法
.掌握重载概念和用法
.了解系统的编译多态性与运行多态性
多态性(polymorphism)这个词来自希腊语。是指“多形态”的意思。在某些程序设计语言中,多态性指相同的语言结构可以代表不同类型的实体(如同一变量可以匹配各种类型的语法结构)或者对不同类型的实体进行操作(如同一个函数可以对不同结构的表进行操作)。在强类型语言中,多态性表现为重载(overloading)和类属(genericity),又称为参数化多态(parameterized polymorphism)。在面向对象的概念中,多态性则是指不同对象收到相同消息时,根据对象类不同产生不同动作。C++允许程序员发送相同消息到不同的相关对象,而由对象决定如何完成该动作,并且支持软件选择实现决策的时间。其中运行时的多态是面向对象的程序设计语言所独有的,有人认为,只有与动态联编相结合的多态才是真正的面向对象的多态。在此,仍然取多态性的广泛含义,但概念重点放在运行多态上。
多态性提供了把接口与实现分开的另外一个方法。多态性提高了代码的组织性和可读性,更重要的是它使软件的可扩充性有了充分的提高,使得软件可以较容易地增加新的特性和功能。正如在上一章讲的,可以把基类对象和不同的派生类对象在某些时候视为同一类型,再加上动态联编,就使同一个接口可以在不同的情况下有不同的实现,而实现的增多也不会影响到接口的形态。
6.1 重载与程序设计的多态性设计
具体讲,C++支持两种多态性:编译时的多态性和运行时的多态性。编译时的多态主要体现为函数重载以及特殊的函数重载——运算符重载,运行时的多态则由虚函数来完成。在分别讨论这两种多态性之前,首先要进一步搞清重载的概念和用法。
6.1.1 函数重载
(1)为什么要重载函数
在自然语言中,除了一词多义之外,即使是同一个动词在不同的情况下,也有细微的判别,如洗衣服和洗车中的“洗”。这在人类语言中基本上不会引起误会。但在计算机语言中,每个名称在计算机内部必须是唯一的标识符。如打印数就必须根据需要打印的数来定义不同的打印函数。这种定义一方面使得程序的可读性变差,使程序员的工作变得复杂,另一方面也没有反映不同的打印函数之间的共同点。
幸运的是,C++提供了函数重载的机制,通过函数的参数数目或类型所建立的附加定义,使同一函数名在计算机内部具有不同的标识符,从而能够表现不同行为。如打印数可以表示为:
void print(int);
void print(float);
void print(char);
函数重载是一种方便的语言机制,它既可以运用于成员函数,也可以运用于一般函数,成尤其是类构造函数,一般都有是重载的。
(2)重载的方法
定义函数重载,函数名字相同,但所带的参数的个数或类型不同,编译器能够根据参数来调用不同的同名函数。
如果函数的参数类型完全一致,仅仅是返回类型不同,则编译器认为出错。其原因有二:①当函数的返回值不赋给某一个变量时,系统无法判断应调用哪一个函数;②即使当函数返回值赋给一个变量时,系统也无法判断这一赋值是否进行了类型转换。如
int hello();
float hello();
当在程序中以下面的方式调用时,就会出现二义性问题:
float f;
f=hello();
如果存在着两个完全一致的函数定义,则认为第二个定义覆盖了第一个定义。
(3)重载的注意点
函数重载提供了便利,但何时重载函数名收益最大却始终是一个问题。当一组函数执行相似的操作时,要慎重考虑,是否有其他更好的处理方法。程序员在编写程序时不应着眼于语言的特征,而应重点解决实际问题。在使用语言的特性时,应遵循应用程序的逻辑结构,绝不可滥用语言所拥有的特性。
(4)函数重载的例子
构造函数的重载,可以使系统的几个不同的对象初始化方式。
类成员函数的重载,使成员变量处理更有效率。
类外的一般函数也允许重载,常常用于一种多态性。如乘法运算。
[例6.1]最大值函数max的重载版本程序EX6_1.CPP。
6.1.2 运算符重载
运算符重载是对系统已有预定义的运算符赋予新的含义,用自然的方式将其发展到特殊应用领域。
重载一个运算符,要求满足两个条件:第一,不能改变运算符的初始意义;第二不能改变运算符的操作的参数数目。运算符重载只是增加了一些与定义它的类相关的附加意义。
表6.1 C++中可能重载的运算符
+
-
*
/
%
^
|
~
!
=
+=
-=
*=
/=
%=
^=
=
!=
=
=
= =
!=
=
=
您可能关注的文档
- 《日语口笔译》课程整体教学设计.doc
- 《桂花雨》教学课例.doc
- 《水轮机检修》--高技.doc
- 【doc】团体健康险直付理赔服务模式初探.doc
- 【PPT】-中国人寿保险公司健康险话术专题(48页)-保险话术.ppt
- 【安邦】车险人伤理赔实务手册.doc
- 【全国百强校首发】黑龙江省哈尔滨市第三中学2016届高三上学期第二次检测数学(文)试题.docx
- 【大学信息技术导论】10 信息化与信息技术.ppt
- 【全国百强校首发】黑龙江省哈尔滨市第三中学2016届高三上学期第二次检测数学(理)试题.docx
- 【广发金工】成交量缩减,波动率C_P创新低-ETF期权每周跟踪(20150720-20150724).docx
最近下载
- (课堂用)TheFutureoftheEnglish(课件.ppt VIP
- 数学与生活:一元二次方程的起源.pptx VIP
- 2025年冷链物流十年发展蓝皮书.docx
- (完整版)张汉熙高级英语TheFutureoftheEnglish.ppt VIP
- (2025年)消化系统影像诊断考试题及答案.docx VIP
- 党支部2025年度组织生活会班子对照检查材料.docx VIP
- DGTJ08-2440-2023 桥梁抗震设计标准.pdf VIP
- 高级英语精品课程教案 TheFutureoftheEnglish.pdf VIP
- 水质运维质控检查报告.docx VIP
- 2024-2025学年山西省吕梁市孝义市七年级下学期期中数学试题.doc VIP
原创力文档

文档评论(0)