08 第八章 多态.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第八章 多态性 多态性作用 函数重载 运算符重载 虚函数 抽象类 拷贝构造函数 友元 §8.1 程序的多态性 多态性:在程序中同一符号或名字在不同情况下具有不同解释的现象。 多态性的两种最基本形式 编译时多态性:指在程序编译阶段即可确定下来的多态性 由重载机制实现: 函数重载 运算符重载 运行时多态性:指必须等到程序动态运行时才可确定的多态性: 由继承+虚函数 动态绑定 注意区分重载、重定义与重命名 重载:在声明函数原型时,只要形参的个数或者对应位置的类型不同,两个或更多的函数就可以共用同一个名字。 重定义:如果在派生类中定义了一个函数原型与继承成员一模一样的成员函数,则该函数称为对继承成员函数的重定义。 重命名:指在派生类中不改变继承成员的语义,仅仅为该成员起一个新名字。 §8.2 函数重载 函数重载:同一作用域中允许多个函数使用同一函数名,但函数原型的形式参数的个数或者对应位置的类型不同。 一、函数重载的方法 C语言不支持函数重载,所以每一个函数必须具有唯一的名字 例:求绝对值 int abs(int); 整型 long labs(long); 长整型 float fabs(float); 浮点型 C++的函数重载:编译程序根据实际参数的个数与相应位置的类型选择调用哪一个版本的重载函数。 例1: #include iostream.h? int abs(int x) // 整数类型数据的绝对值函数 { cout Using integer version of abs().\n; return (x = 0 ? x : -x); }? double abs(double x) // 浮点类型数据的绝对值函数 { cout Using floating-point version of abs().\n; return (x = 0.0 ? x : -x); }? long abs(long x) // 长整数类型数据的绝对值函数 { cout Using long integer version of abs().\n; return (x = 0 ? x : -x); }? int main() { cout abs(-5) \n; // 调用abs( )的整数版本 cout abs(-5L) \n; // 调用abs( )的长整数版本 cout abs(3.14) \n; // 调用abs( )的浮点版本 return 0; } 二、函数重载的注意事项 编译程序选择相应的重载函数版本时函数返回值类型不起作用。 例:int fun(int); double fun(int); 不是重载函数 用typedef声明的类型别名,并没有创建新的数据类型 例:typedef double MONEY; double calculate(double income); MONEY calculate(MONEY income); 不是重载函数 不同参数传递方式无法区别重载函数 例:void fun(int value); void fun(int value); 不是重载函数 三、函数重载的二义性的原因 1. 函数调用时参数的隐式类型转换 函数调用时,编译程序选择重载函数的原则:如果函数调用的实际参数类型与一个重载函数的形式参数类型完全匹配,则选择调用该重载函数;如果找不到与实际参数类型完全匹配的函数原型,但如果将实参类型转换为更高级类型后能找到完全匹配,编译程序将选择该重载函数。 隐式类型转换是由编译程序自动完成,易引起函数重载的二义性 例: #include iostream.h ?float abs(float x) { return (x = 0 ? x : -x); } double abs(double x) { return (x = 0 ? x : -x); } ? int main() { cout abs(3.14) \n; // 调用abs(double)的版本 // cout abs(-5) \n;// 错误,编译程序无法确定调用abs()的哪一个版本 return 0; } 2. 在重载函数中使用缺省参数也可能 造成二义性 例3: #include iostream.h int func( int i ) { return i; } int func( int i, int j = 10 ) { return i * j; } int main() { cout func( 3, 4) \n; //

文档评论(0)

daixuefei + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档