欢迎来到天天文库
浏览记录
ID:52065031
大小:585.00 KB
页数:58页
时间:2020-03-31
《《C语言中的多态性》PPT课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章多态性8.1多态性概述8.2运算符重载8.3虚函数8.4抽象类8.1多态性概述通俗地说,多态性是指用一个相同的名字定义不同的函数,这些函数的执行过程不同,但是有相似的操作,即用同样的接口访问不同的函数。面向对象的多态性从实现的角度来讲,可以分为静态多态性和动态多态性两种。静态多态性是在编译的过程中确定同名操作的具体操作对象的,而动态多态性则是在程序运行过程中动态地确定操作所针对的具体对象的。这种确定操作具体对象的过程就是联编(binding),也称为绑定。联编是指计算机程序自身彼此关联的过程。也就是把一个标识符名和一个
2、存储地址联系在一起的过程。用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。所谓消息,是指对类的成员函数的调用。不同的方法是指不同的实现,也就是调用了不同的函数。按照联编进行阶段的不同,联编方法可以分为两种:静态联编和动态联编。这两种联编过程分别对应着多态的两种实现方式。联编工作在编译连接阶段完成的情况称为静态联编。在编译、连接过程中,系统就可以根据类型匹配等特征确定程序中操作调用与执行该操作的代码的关系,即确定某一个同名标识到底是要调用哪一段程序代码。函数重载和运算符重载就属于静态多态性。和静态联编相对应,如
3、果联编工作在程序运行阶段完成,则称为动态联编。在编译、连接过程中无法解决的联编问题,要等到程序开始运行之后再来确定。例如,本章将要介绍的虚函数就是通过动态联编完成的。函数重载在函数及类的章节中曾做过详细的讨论,所以在本章中,静态多态性主要介绍运算符重载;对于动态多态性,将对虚函数作详细介绍。8.2运算符重载C++中预定义的运算符的操作对象只能是基本数据类型。实际上,对于很多用户自定义的类型(如类),也需要有类似的运算操作。例如点类point。classpoint{private:intx,y;public://构造函数poi
4、nt(intxx=0,intyy=0){x=xx;y=yy;}intget_x();//显示x值intget_y();//显示y值//...};声明点类的对象:pointp1(1,1),p2(3,3)如果我们需要对p1和p2进行加法运算,如果写出表达式“p1+p2”,编译时却会出错,因为编译器不知道该如何完成这个加法。这时我们就需要编写程序来说明“+”怎样作用于point类对象时,该实现什么样的功能,这就是运算符重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,导致不同类型的行为。在运算符重
5、载的实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后,根据实参的类型来确定需要调用的函数。这个过程是在编译过程中完成的。8.2.1运算符重载的规则运算符重载时必须要遵守一定的规则。①C++中的运算符除了少数几个(类属关系运算符“.”、作用域分辨符“::”、成员指针运算符“*”、sizeof运算符和三目运算符“?:”)之外,全部可以重载,而且只能重载C++中已有的运算符,不能臆造新的运算符。②重载之后运算符的优先级和结合性都不能改变,也不能改变运算符的语法结构,即单目运算符只能重
6、载为单目运算符,双目运算符只能重载为双目运算符。③运算符重载后的功能应当与原有功能相类似。④重载运算符含义必须清楚,不能有二义性。运算符的重载形式有两种:重载为类的成员函数和重载为类的友元函数。运算符重载为类的成员函数的一般语法形式如下:<函数类型>operator<运算符>(形参表){函数体;}运算符重载为类的友元函数的一般语法形式如下:friend<函数类型>operator<运算符>(形参表){函数体;}其中:①函数类型指定了重载运算符的返回值类型,也就是运算结果类型。②operator是定义运算符重载函数的关键字。③
7、运算符是要重载的运算符名称。④形参表给出重载运算符所需要的参数和类型。⑤friend是对于运算符重载为友元函数时,在函数类型说明之前使用的关键字。特别需要注意的是,当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个(后置“++”、“--”除外);当重载为类的友元函数时,参数个数与原操作数的个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。8.2.2运算符重载为成员函数运算符重载实质上就是函数重载,当运
8、算符重载为成员函数之后,它就可以自由地访问本类的数据成员了。实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,一个操作数是对象本身的数据,由this指针指出,另一个操作数则需要通过运算符重载函数的参数表来传递;如果是单目运算符,操作数由对象的this指针给出,就不再需
此文档下载收益归作者所有