- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 多态性和虚函数
5.1 多态性(polymorphism)的定义
(一)定义:多态性 - 能够呈现不同形态的特性和状态。
polymorphism - the quality or state of being able to assume different forms。(摘自Webster词典)
(二)两种多态性
1.编译时的多态性:亦称静态联编(束定)(static binding)或早期联编(early binding)。即本章中前半部分将要讲述的函数和运算符[函数]的重载。编译系统进行编译时在函数调用指令表中找到多个重载的函数中相对应的一个函数(即形参的数量和类型完全匹配的那个函数),将它们与主程序中调用它们的代码联编(binding),以备主程序运行时正确地调用。这在C++中这表现为“行为共享”(即同名函数实现不同功能),或称“同一接口,多种方法”。
2.所谓运行时的多态性:亦称所谓动态联编(束定)(dynamic binding)或滞后联编(late binding)。编译系统进行编译时,根据程序代码内容、按照运行时被动态地确定的this指针、找到相应的虚函数,将它与主程序中调用它的代码联编(binding),以供主程序在运行中调用它(本章后半部分将详细讲解)。
5.2 函数重载(overloading)
5.2.1 普通函数的重载
C语言中一个函数只能处理一个类型的数据。例如,第三章§3.1中encapsul.cpp中两个函数sq_int(int)和sq_dbl(double)都是如此,其中sq_int(int)只能处理整型数据,而sq_dbl(dou
ble)只能处理double浮点型数据。
能否使用一个函数来处理多个类型的数据?这可以在面向对象程序设计语言中解决。在C++中可用一个函数名sq(… )来处理所有参数类型的平方,例子如下。
[例1]平方函数的重载:两个单形参的重载函数
// overld_fun1.cpp
//overloading of functions
#include iostream.h
double sq(double y)
{
return y*y;
}
int sq(int y)
{
return y*y;
}
void main()
{
int i=5;
double d=5.5;
coutsq(i)endl;
coutsq(d)endl;
}
/* Results:
25
30.25 */
[例2]求最大值函数的重载:三个双形参的重载函数
// overld_fun2.cpp
// overloaded function for determining max value
#include iostream.h
#include string.h
int max(int x, int y)
{
return xy? x: y;
}
double max(double x, double y)
{
return xy? x: y;
}
char* max(char* x, char* y)
{
return strcmp(x, y)0? x: y;
}
void main()
{
coutmax(9, 4)endl;
coutmax(4.5, 7.4)endl;
coutmax(Windows, MS-DOS)endl;
}
/* Results:
9
7.4
Windows */
在使用重载的普通函数时,应注意避免如下所示的二义性。
// ambig_3.cpp
// not working
// difference only in return type is not enough
#include iostream.h
int fun(int y)
{
return y;
}
void fun(int y)
{
++y;
}
// error: void fun(int) : overloaded function differs
// only by return type from int fun(int)
// error: fun : redefinition; different basic types
void main()
{
int i=5;
coutfun(i)endl;
}
/* Not working! */
以上例子中,两个重载的普通函数只有返回值不同,而其他参数都相同,这是不够的,将引起二义性,所以出现编译错误。
5.2.2 构造函数的重载
任何函数都能重载,构造函数也能或者必须重载。第三章§3.5.2“同类对象间数据成员的复制”中[例3]的程序operator=_6.
文档评论(0)