版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章、多态性本章介绍多态性的基本概念、运算符重载实现方法、本章介绍多态性的基本概念、运算符重载实现方法、虚函数等内容。虚函数等内容。面向对象的程序设计3/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 本章主要内容: 多态性概述 运算符重载 类型转换 虚函数面向对象的程序设计4/21多态性概念 多态性就是不同对象收到相同的消息时,产生不同的动作。 直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类
2、型转换5.3 虚函数5.4面向对象的程序设计5/21 多态的实现 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。 编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。编译时多态性主要是通过函数重载和运算符重载实现的。 运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。运行时多态性主要是通过虚函数来实现的。 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计6/21编译期多态运算符重载 简单地说,多态就是给不同类型的对象发送相同的消息时,对象会做出不同的响应。 一般情况下,我们所说的面向对象程
3、序设计中的多态,所指的都是由虚函数实现的运行时多态。 从概念上看,C+的运算符重载技术也可以看成是一种实现多态的手段。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计7/21什么是运算符重载 C+中现有的绝大多数运算符只能以基本数据类型的量作为其操作的对象。运算符重载就是要给现有的运算符赋予新的功能,使其可以操作类的对象。 运算符重载的本质是函数重载。如果为某个类设计了运算符op的重载函数,则当使用op操作该类的对象时,编译器将调用运算符重载函数完成操作任务。 由于运算符重载函数的调用方式是静态绑定,所以可以将运算符重载称之为编译期多态
4、。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计8/21C+对运算符重载的限定1)只能重载现有的运算符,而不能创造新的运算符; 2) 现有运算符中,以下几个不能被重载,它们是:用于访问对象成员的“.”操作符、成员指针运算符“*”、域解析操作符“:”、条件运算符“?:”、sizeof运算符、typeid运算符、和四个类型转换操作符:const_cast、static_cast、dynamic_cast、reinterpret_cast ; 3) 运算符重载不能改变原运算符的优先级和结合性; 第五章、多态性第五章、多态性多态性概念5.1运
5、算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计9/21 C+对运算符重载的限定(续) 4)运算符重载不能改变原运算符的操作数个数;即一元运算符被重载后,还是一元运算符,二元运算符被重载后,还是二元运算符; 5)重载后的运算符必须至少有一个操作数是类的对象。这条限定防止编程者为基本数据类型重载运算符。否则,编程者有可能重载加法运算符“+”,来完成基本数据类型的减法运算; 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计10/21 C+对运算符重载的限定(续) 6) 运算符重载函数可以是类的成员函数,也可以是类的友元函数。但是
6、以下的运算符只能通过成员函数进行重载。它们是:赋值运算符“=”、函数调用操作符“()”、数组下标操作符“”、使用指针访问对象成员的操作符“-” 。 关键字operator用来声明和定义运算符重载函数。运算符重载函数可以是类的非静态成员函数,也可以是类的友元函数。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计11/21类的成员函数实现运算符重载 当运算符重载函数被定义为类的成员函数时,声明和定义的语法格式如下: 在类中声明运算符重载函数(类的成员函数) : 返回值类型 operator 运算符 (形参列表); 定义运算符重载函数(类的成
7、员函数) : 返回值类型 类名:operator 运算符 (形参列表) 函数体; 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计12/21类的成员函数实现运算符重载 形参列表中是运算符的操作对象,需要注意,因为被定义为是类的成员函数,所以参数的个数应该比运算符实际的操作数个数少一个,因为调用函数的对象本身就是运算符的一个操作数。例如,如果为A类重载了加法运算符“+”,用来完成两个A类对象的相加操作,且运算符重载函数为类的成员函数,则函数的声明语句为: A operator+ (A a); 第五章、多态性第五章、多态性多态性概念5.1运
8、算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计13/21重载一元运算符 一元运算符有前置(运算符在操作数之前,如-a,&a)和后置(运算符在操作数之后,如a+,a-)之分。 C+语法规定,当使用类的成员函数实现一元运算符重载时,前置一元运算符的重载函数没有形式参数;而后置一元运算符的重载函数有一个int型的形式参数,这个int型参数的作用就是帮助编译器区分前置和后置的一元运算符重载函数,所以在定义函数时,无需写出参数名。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计14/21双目运算符重载: 在类中声明运算符重载
9、函数(类的成员函数) : 返回值类型 operator 运算符 (形参列表); 定义运算符重载函数(类的成员函数) : 返回值类型 类名:operator 运算符 (形参列表) 函数体; 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计15/21友元函数实现运算符重载 将运算符重载函数声明和定义为类的友元函数的语法格式如下: 首先在类中使用关键字friend,将运算符重载函数声明为类的友元函数: friend 返回值类型 operator运算符(形参列表); 在类外定义友元函数时,不能使用关键字friend: 返回值类型 operato
10、r运算符(形参列表) 函数体; 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计16/21友元函数实现运算符重载 友元函数不是类的成员函数,所以函数内部没有隐含的this指针,函数的参数个数和运算符的操作数个数相同。但对于一元运算符重载函数而言,在后置运算符重载函数中应多声明了一个int型参数,该参数的唯一作用就是区分前置和后置重载函数。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计17/21成员函数与友元函数实现运算符重载异同1) 成员函数较友元函数多一个参数;2) 双目运算
11、符均可以采用两种方式实现,单目运算符有时候只能采用友元来实现;如: obj = 100 + obj;3) 调用方式可以采用习惯方式,也可采用专门方式调用;4) C+中的大部分运算符,可以声明为成员或友元函数。 第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计18/21赋值运算符”=”的重载采用默认的赋值运算符实现的数据成员赋值是一种浅拷贝,涉及到深层次应用的使用会产生一定的问题。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计19/21这就是指针悬挂(Dangling Point
12、er)问题 导致悬挂指针的两个经典场景: 1、对已释放的C+对象进行重引用,即释放重引用漏洞; 2、函数返回本地变量指针,但该变量只在函数内部定义,导致函数执行完后此指针变成无效指针。第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计20/21深层复制解决赋值“=”的指针悬挂增加自定义赋值运算符重载函数第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4面向对象的程序设计21/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 运算符重载 小结 友元函数实现 普
13、通函数实现 指针悬挂的解决面向对象的程序设计22/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 类型转换 系统预定义类型间的转换 隐式类型转换1)赋值表达式A=B,B先转换成A类型再赋值2)char/short与int运算时,转换成int类型3)操作对象不一致时,级别低转级别高类型 显式类型转换(强制类型转换) 类型名() 如:int(a + b)面向对象的程序设计23/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 类类型与系统预定义类型间的转换 1、转换构造函数(构造函数实现数据到类转换) 在中定
14、义一个只有一个参数的构造函数,参数是待转换类型的数据,在函数体中指定转换的方法。类名(待转换类型的数据) 如: Complex(7.7) 面向对象的程序设计24/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 类类型与系统预定义类型间的转换 2、类型转换函数 类型转换函数的作用是将一个类的对象转换成另一类型的数据。operator 目标类型()函数体 如: double(com);面向对象的程序设计25/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 C+中的强制类型转换 显示转换(explicit c
15、onversion)也称强制类型转换,主要包括一下四种强制类型转换操作符: const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。 如int转换成char。 dynamic_cast,命名上理解是动态类型转换。 如子类和父类之间的多态类型转换。 reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。强制类型转换的一般格式:强制类型转换的一般格式: cast_name(expression)面向对象的程序设计26/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 C+中的强制
16、类型转换 1) static_cast(a)将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。表达式static_cast(a),a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。 static_cast它能在内置的数据类型间互相转换,对于类只能在有联系的指针类型间进行转换。可以在继承体系中把指针转换来、转换去,但是不能转换成继承体系外的一种类型。面向对象的程序设计27/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 C+中的强制类型转换 2)dynamic_cast(a)完成类层次结构中的提升。
17、T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。表达式dynamic_cast(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。 与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系。 dynamic_cast要比static_cast安全,如果转换不了,dynamic_cast会返回NULL。面向对象的程序设计28/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 C+中的强制类型转换3) const_cast(a)/b 去掉类
18、型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。表达式const_cast(a)被用于从一个类中去除以下这些属性:const, volatile, 和unaligned。面向对象的程序设计29/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 C+中强制类型转换: 任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。表达式reinterpret_cast(a)能够用于诸如char* 到 int*,或者One_class* 到 Unrelated_class*等类似这样的转换,
19、因此可能是不安全的。面向对象的程序设计30/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 类型转换 构造函数实现的赋值“=” 强制类型转换面向对象的程序设计31/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。 编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。编译时多态性主要是通过函数重载和运算符重载实现的。 运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。运行时多态性主要是通过虚函数虚函数来实
20、现的。 面向对象的程序设计32/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数 虚函数提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。 面向对象的程序设计33/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数的引入 C+规定:基类的对象指针可以指向它的公有派生的对象,但是当其指向公有派生类对象时,只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员。面向对象的程序设计34/21第五章、多态性
21、第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数的作用和定义(1) 虚函数同派生类的结合可使C+支持运行时的多态性,实现了在基类定义派生类所拥有的通用接口,而在派生类定义具体的实现方法,即常说的“同一接口,多种方法”,它帮助程序员处理越来越复杂的程序。面向对象的程序设计35/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数的定义和作用(2)面向对象的程序设计36/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数的定义和作用(3) 定义虚函数的方法如下: vi
22、rtual 函数类型 函数名(形参表) / 函数体 如果在基类中声明虚成员函数,则在所有派生类中该函数都是虚函数,即使在派生类中声明该函数时没有使用关键字virtual。 当使用基类指针或引用调用虚成员函数时,实际调用的是指针指向的具体对象所属类中定义(覆盖)的成员函数。这种函数调用方式称为多态调用。 面向对象的程序设计37/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数的定义与作用(4) 注意:虚函数的声明应该放在基类中,如果只在派生类中将成员函数声明为虚函数,则即使基类指针实际指向的是派生类的对象,也不能通过该指针调用派生类中的虚成员函
23、数。如果想在某个类层次中实现多态,则应该在这个层次中的基类里声明虚函数。 说明: 不能将类的静态成员函数声明为虚函数 ; 不能将类的构造函数声明为虚函数; 应该把类的析构函数声明为虚函数。面向对象的程序设计38/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数与动态绑定(1) 为什么只有虚成员函数才能实现多态调用呢?这是由编译器处理函数调用的方式决定的。非虚函数的调用方式为静态绑定静态绑定,而虚函数的调用方式为动态绑动态绑定定。 绑定是指将函数调用和实际的函数相连接的过程。分为静态绑定和动态绑定。 面向对象的程序设计39/21第五章、多态性第五章、多态性多态性概念5.1运算符重载5.2类型转换5.3 虚函数5.4 虚函数与动态绑定(2) 静态绑定是在程序编译时,就确定要调用的函数,并用函数的相对地址直接调用函数,所以静态绑定又被称为编译期绑定或前期绑定。 动态绑定是指,在程序编译期无法确定要调用的函数,在程序的运行过程中,根据调用函数的指针或引用变量所引用的对象的具体类型动态地确定要调用的函数。所以动态绑定又被称为运行期绑定或后期绑定。C+中的虚成员函数使用动态绑定方式进行调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新余学院《插画设计》2023-2024学年第一学期期末试卷
- 西南医科大学《医学统计学》2022-2023学年第一学期期末试卷
- 西南医科大学《管理心理学》2023-2024学年第一学期期末试卷
- 西南交通大学《设计色彩》2021-2022学年第一学期期末试卷
- 西华师范大学《比较文学》2022-2023学年第一学期期末试卷
- 西昌学院《展示设计》2022-2023学年第一学期期末试卷
- 2025年中国无极灯行业发展现状、进出口贸易及市场规模预测报告
- 合同能源管理项目融资及解决方案
- 《施工安全基础》课件
- 【化学】第十单元 常见的酸、碱、盐重难点梳理课件-2024-2025学年九年级化学人教版(2024)下册
- NB-T 10641-2021 电动汽车非车载充电机现场检测仪
- 诚意金合同协议模板
- 主持人合同协议书范文模板
- 完整版交管12123驾照学法复习题库大全附答案解析
- 2024年达州水务集团限公司招聘历年【重点基础提升】模拟试题(共500题)附带答案详解
- 2024年中华人民共和国企业所得税年度纳税申报表(带公式)20240301更新
- CJT480-2015 高密度聚乙烯外护管聚氨酯发泡预制直埋保温复合塑料管
- JT-T-1180.5-2018交通运输企业安全生产标准化建设基本规范第5部分:道路货物运输站场
- 父亲同意孩子改姓委托书范本
- 颅脑外伤的麻醉管理
- 国家开放大学本科《会计实务专题》形考作业一至四试题及答案
评论
0/150
提交评论