- 1、本文档共128页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 多 态 性 ? 知识点 l?????? 编程时的多态性与运行时的多态性 l?????? 函数重载 l?????? 运算符重载 l?????? 虚函数 l?????? 应用举例 ? 难点 l?????? 函数重载 l?????? 虚函数 l?????? 运算符重载 l?????? 纯虚函数和抽象类 ? 要求 掌握: l?????? 运行时的多态性 l?????? 函数重载 了解: l?????? 运算符重载 l???? 虚函数 4.1 编程时的多态性与运行时的多态性 所谓多态性就是不同对象收到相同的信息时,产生不同的动作。也就是说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,即用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。 在C++中,多态性的实现和联编这一概念有关。一个源程序经过编译、连接,成为可执行文件的过程是把可执行代码联编在一起的过程。其中在运行之前就完成的联编称为静态编,又叫前期联编;而在程序运行时才完成的联编叫动态联编,也称后期联编。 静态联编是指系统在编译时就决定如何实现某一动作。静态联编要求在程序编译时就知道调用函数的全部信息。因此,这种联编类型的函数调用速度很快。效率高是静态联编的主要优点。 动态联编是指系统在运行时动态实现某一动作。采用这种联编方式,一直要到程序运行时才能确定调用哪个函数。动态联编的主要优点是:提供了更好的灵活性、问题抽象性和程序易维护性。 静态联编支持的多态性称为编译时多态性,也称静态多态性。在C++中,编译时的多态性是通过函数重载和运算重载实现的。 动态联编所支持的多态性称为运行时的多态性,也称动态多态性。在C++中,运行时的多态性是通过继承和虚函数来实现的。下面分别对他们进行讨论。 4.2 函数重载 编译时的多态性可以通过函数重载来实现。函数重载的意义在于它能用同一个名字访问一组相关的函数,即可以有多个同名但参数形式不完全相同的函数。在调用时无需记忆多个函数名,编译器根据实参的类型来确定应该调用哪一个函数。两个或两个以上的函数共用一个函数名称为函数重载,被重载的函数称为重载函数。 函数重载无须特别声明,只要所定义的函数与已定义的同名函数形参形式不完全相同,C++编译器就认为是函数重载。例如以下两个函数: void GetTime(long *ticks); Void GetTime(int* hours,int* minutes,int *seconds); 它们作用相同,都是返回当前时间,只是其返回时间的形式不同,使用相同的函数名,但其参数形式不同。 例4-1 求一个数的平方 # includeiostream.h int square(int i) {return i*i;} float square(float f) {return f*f;} double square(double d) {return d*d;} int main() {int i=12; float f=3.4; double d=5.67; couti*i=square(i)endl; coutf*f=square(f)endl; coutd*d=square(d)endl; return 0; } 程序运行结果为: 12*12=144 3.4*3.4=11.56 5.67*5.67=32.1489 程序中定义了三个名为square的函数,它们的函数原型不同,编译器在遇到程序中对square函数的调用时根据参数形式进行匹配,如果找不到相对应的参数形式的函数定义,编译器认为该函数没有函数原型,给出错误信息。 函数重载时应注意,如果某个函数参数有缺省值,必须保证其参数缺省后调用形式不与其他函数混淆。例如下面的重载是错误的: int f(int a,float b); void f(int a,float b,int c=0); 因为第二个函数缺省参数c后,其形式与第一个函数参数形式相同,下面的函数调用语句: f(10,2.0);就具有二义性,既可以调用第一个函数,也可以调用第二个函数,编译器不能根据参数的形式确定到底调用哪一个。 类的函数成员也可以重载,如构造函数,一个类可以有多个不同参数形式的构造函数。类的函数成员的重载与全局函数重载的方法相同。 4.3 运算符重载 在C++中,除了可以对函数重载外,还可以对大多数运算符进行重载。运算符重载通过创建运算符函数operator()来实现。运算符函数定义了重载的运算符将要进行的操作,这种操作通常作用在一个类上。函数operator()可以是它将要操作的类的成员,也可以不是类的成员。但非成员operator()函数通常是类的友元函数。本节将介绍有关运算重载方
您可能关注的文档
- 数据库系统原理与应用SQLSever2005课件作者刘志成颜谦和主编04-第4章节数据查询.ppt
- 数据库系统原理与应用SQLSever2005课件作者刘志成颜谦和主编07-第7章节数据库完整性.ppt
- 数据库系统原理与应用技术课件作者陈漫红第1章节数据库系统概述.ppt
- 导游基础知识课件作者秦合岗第五章节中国古代建筑与园林.ppt
- 数据库系统原理与应用技术课件作者陈漫红第3章节关系数据库理论基础.ppt
- 房地产经营与管理课件作者隋凤琴1绪论.ppt
- 数据库系统原理与应用技术课件作者陈漫红第5章节数据库规范化理论.ppt
- 房屋构造与识图课件作者王立群主编第1章节-第2章节.ppt
- 数据库系统原理与应用技术课件作者陈漫红第8章节SQLServer2005概述.ppt
- 数据库系统原理与应用技术课件作者陈漫红第10章节基本表的创建与管理.ppt
文档评论(0)