第七讲 多态性及虚函数_第1页
第七讲 多态性及虚函数_第2页
第七讲 多态性及虚函数_第3页
第七讲 多态性及虚函数_第4页
第七讲 多态性及虚函数_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七讲第七讲 多态性与虚函数多态性与虚函数 主讲人:生主讲人:生 龙龙Email: 内容提要内容提要 多态性与虚函数多态性与虚函数 基本概念基本概念 运算符重载运算符重载 虚函数虚函数 纯虚函数与抽象类纯虚函数与抽象类 虚析构函数虚析构函数 课堂练习课堂练习 作业作业 基本概念基本概念消息消息对类的成员函数的调用对类的成员函数的调用动作动作成员函数的实现(定义)成员函数的实现(定义)程序编译时的多态性程序编译时的多态性函数和运算符重载函数和运算符重载静态关联静态关联程序运行时的多态性程序运行时的多态性继承和虚函数继承和虚函数动态关联动态关联 多态性是指不同的对象收到多态性是指不同的对象收到相同

2、的消息相同的消息时,产生时,产生不同不同的动作的动作。关联(联编)关联(联编)确定操作对象的过程叫做关联确定操作对象的过程叫做关联多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数例例 7.1多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数 运算符重载运算符重载本质是函数重载本质是函数重载格式:格式: 函数返回值类型函数返回值类型 operator 运算符(形参列表)运算符(形参列表)

3、函数体函数体;其中,关键字其中,关键字operator加上运算符名加上运算符名构成构成运算符函数名运算符函数名。不可重载的运算符有:(防止破坏不可重载的运算符有:(防止破坏C+的安全机制)的安全机制). 成员选择运算符成员选择运算符.* 成员指针运算符成员指针运算符: 作用域限定运算符作用域限定运算符? : 三目条件运算符三目条件运算符sizeof 求字节数运算符求字节数运算符 多态性与虚函数多态性与虚函数运算符重载的规则:运算符重载的规则: 不能重载不能重载C+中没有的运算符;中没有的运算符; 重载后运算符的优先级和结合性不变,目数和重载后运算符的优先级和结合性不变,目数和语法结构也不变;语

4、法结构也不变; 运算符重载是针对新类型数据的实际需要,对运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,因此不能改变运原有运算符进行适当的改造,因此不能改变运算符的语义。算符的语义。多态性与虚函数多态性与虚函数1、运算符重载作为成员函数运算符重载作为成员函数格式:格式: 函数返回值类型函数返回值类型 类名类名:operator 运算符(形参列表)运算符(形参列表) 函数体函数体; 运算符重载函数作为类的成员函数时,作为操作数运算符重载函数作为类的成员函数时,作为操作数的函数参数个数比原来的操作数个数少一个。因为对象的函数参数个数比原来的操作数个数少一个。因为对象本身充当了运算

5、符的第一个操作数。本身充当了运算符的第一个操作数。多态性与虚函数多态性与虚函数例例 7.2 定义一个定义一个Time类,通过重载运算符类,通过重载运算符“+”实现两个实现两个Time类对象相加。类对象相加。多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数2、运算符重载作为类的友元函数运算符重载作为类的友元函数格式:格式: friend 函数返回值类型函数返回值类型 operator 运算符(形参列表)运算符(形参列表) 函数体函数体; 运算符重载函数作为类的友元函数时,因为友元函运算符重载函数作为类的友元函数时,因为友元函数不是类的成员函数,所以其参数个数不

6、变。数不是类的成员函数,所以其参数个数不变。多态性与虚函数多态性与虚函数例例 7.3 重载运算符进行复数类数据运算。重载运算符进行复数类数据运算。多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数自学其它运算符重载的相关知识。自学其它运算符重载的相关知识。运算符重载的特点及运用:运算符重载的特点及运用: 单目运算符多被重载为类的成员函数,双目运算符多被重载为单目运算符多被重载为类的成员函数,双目运算符多被重载为类的友元函数;类的友元函数; 双目运算符中的双目运算符中的=、()、和和-不能被重载为类的友元函数;不能被重载为类的友元函数; 类型转换函数只能定义为成

7、员函数,不能定义为友元函数;类型转换函数只能定义为成员函数,不能定义为友元函数; 当某运算符的操作需要改变对象的状态时,应被重载为成员函当某运算符的操作需要改变对象的状态时,应被重载为成员函数;数; 当运算符具有可交换性时,应被重载为友元函数;当运算符具有可交换性时,应被重载为友元函数; 当运算符的操作数需要进行隐式类型转换时,只能重载为友元当运算符的操作数需要进行隐式类型转换时,只能重载为友元函数。函数。多态性与虚函数多态性与虚函数 虚函数虚函数格式:格式: visual 函数返回值类型函数返回值类型 函数名(形参列表)函数名(形参列表) 函数体函数体; 虚函数在程序运行时才能被确定调用,是

8、虚函数在程序运行时才能被确定调用,是动态关联动态关联的基础;的基础; 虚函数必须虚函数必须是非是非static的的成员函数成员函数; 虚函数必须提供可以在一个或多个派生类中被重定义的接口;虚函数必须提供可以在一个或多个派生类中被重定义的接口; 虚函数虚函数仅适用于有继承关系的对象仅适用于有继承关系的对象,普通函数不能说明为虚函,普通函数不能说明为虚函数;数; 构造函数不能是虚函数,析构函数可以是虚函数;构造函数不能是虚函数,析构函数可以是虚函数; 虚函数在基类中定义,在派生类中被重定义,为所有派生类提虚函数在基类中定义,在派生类中被重定义,为所有派生类提供通用接口;供通用接口; 虚函数一般是通

9、过指向虚函数一般是通过指向基类的指针基类的指针或或引用引用来调用的。来调用的。多态性与虚函数多态性与虚函数例例 7.4 虚函数应用举例虚函数应用举例多态性与虚函数多态性与虚函数如果去掉三个类声明中的如果去掉三个类声明中的virtual关键字,输出?关键字,输出?多态性与虚函数多态性与虚函数去掉三个类声明中的去掉三个类声明中的virtual关键字时的输出:关键字时的输出:如果只去掉如果只去掉First_d和和Second_d类中的类中的virtual关键词,关键词,输出是什么?输出是什么?多态性与虚函数多态性与虚函数只去掉只去掉First_d和和Second_d类中的类中的virtual关键字时

10、关键字时的输出:的输出:多态性与虚函数多态性与虚函数虚函数使用中的注意事项:虚函数使用中的注意事项: 使用虚函数时,派生类必须是对基类的公有继承;使用虚函数时,派生类必须是对基类的公有继承; 一旦某个函数在基类中第一次声明时使用了一旦某个函数在基类中第一次声明时使用了virtual关键字,那关键字,那么当其公有派生类重定义该函数时,无论是否使用了么当其公有派生类重定义该函数时,无论是否使用了virtual关关键字,该成员函数都被看做是虚函数;键字,该成员函数都被看做是虚函数; 虚函数必须是类的成员函数,不能为全局函数和静态函数;虚函数必须是类的成员函数,不能为全局函数和静态函数; 当在派生类中

11、定义了虚函数的重载函数而没有重新定义虚函数当在派生类中定义了虚函数的重载函数而没有重新定义虚函数时,虚函数的重载函数将覆盖类中的虚函数,即派生类对象、时,虚函数的重载函数将覆盖类中的虚函数,即派生类对象、指针或引用无法调用派生类的虚函数;指针或引用无法调用派生类的虚函数; 如果在派生类中没有重新定义虚函数,基类的虚函数就成为了如果在派生类中没有重新定义虚函数,基类的虚函数就成为了派生类的虚函数。派生类的虚函数。 访问虚函数时,应使用指向基类的指针或基类类型的引用,以访问虚函数时,应使用指向基类的指针或基类类型的引用,以满足运行时多态性的要求。满足运行时多态性的要求。多态性与虚函数多态性与虚函数

12、类中虚函数与重载函数的区别:类中虚函数与重载函数的区别:重载函数要求函数有相同的名称,并有不同的参数序重载函数要求函数有相同的名称,并有不同的参数序列;而虚函数则要求函数名、返回值类型和参数序列列;而虚函数则要求函数名、返回值类型和参数序列完全相同;完全相同;重载函数可以是成员函数或友元函数,而虚函数只能重载函数可以是成员函数或友元函数,而虚函数只能是成员函数;是成员函数;重载函数是以参数的差别作为调用不同函数的依据;重载函数是以参数的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数。虚函数是根据对象的不同去调用不同类的虚函数。多态性与虚函数多态性与虚函数 纯虚函数与抽象

13、类纯虚函数与抽象类格式:格式: virtual 函数返回值类型函数返回值类型 函数名(形参列表)函数名(形参列表)=0;说明:说明: 纯虚函数在基类中没有具体的实现,要求在公有派生类中根据纯虚函数在基类中没有具体的实现,要求在公有派生类中根据实际需要定义它的实现;实际需要定义它的实现; 定义有纯虚函数的基类,其构造函数和析构函数中不允许调用定义有纯虚函数的基类,其构造函数和析构函数中不允许调用纯虚函数;纯虚函数; 纯虚函数也可以有函数体,它与一般的虚函数形式上的不同在纯虚函数也可以有函数体,它与一般的虚函数形式上的不同在于后边有于后边有=0; 如果一个类中定义了纯虚函数,那么这个类被称为抽象类

14、。如果一个类中定义了纯虚函数,那么这个类被称为抽象类。多态性与虚函数多态性与虚函数关于抽象类:关于抽象类: 如果一个类中定义了纯虚函数,那么这个类被称为抽象类;如果一个类中定义了纯虚函数,那么这个类被称为抽象类; 抽象类是一种特殊的为了多态地使用其中的成员函数的类,它抽象类是一种特殊的为了多态地使用其中的成员函数的类,它为一个类族(包含有传递继承关系的多层派生类)提供统一的为一个类族(包含有传递继承关系的多层派生类)提供统一的操作界面;操作界面; 抽象类自身无法实例化,即无法创建抽象类的对象;抽象类自身无法实例化,即无法创建抽象类的对象; 抽象类不能作为参数类型、函数返回值或强制类型转换,但可

15、抽象类不能作为参数类型、函数返回值或强制类型转换,但可以定义抽象类的指针和引用以访问派生类成员;以定义抽象类的指针和引用以访问派生类成员; 抽象类的派生类中必须重新定义基类中的纯虚函数,否则它仍抽象类的派生类中必须重新定义基类中的纯虚函数,否则它仍被看做是抽象类。被看做是抽象类。多态性与虚函数多态性与虚函数例例 7.5 抽象类应用举例抽象类应用举例多态性与虚函数多态性与虚函数多态性与虚函数多态性与虚函数 虚析构函数虚析构函数程序输出结果是什么?程序输出结果是什么?多态性与虚函数多态性与虚函数说明:说明: 在在C+中,如果中,如果delete运算符用于释放运算符用于释放指向派生类对象指向派生类对

16、象的的基类基类指针指针,不管基类指针所指向的对象是何种类型,也不管每个类,不管基类指针所指向的对象是何种类型,也不管每个类的析构函数名是不相同的这样的事实,系统都会为这些对象调的析构函数名是不相同的这样的事实,系统都会为这些对象调用基类的析构函数。用基类的析构函数。解决办法:解决办法: 将基类析构函数声明为虚析构函数,使所有派生类的析构函数将基类析构函数声明为虚析构函数,使所有派生类的析构函数自动成为虚析构函数(尽管名字不同)。这样使用自动成为虚析构函数(尽管名字不同)。这样使用delete运算运算符时,系统就会调用相应类的析构函数。符时,系统就会调用相应类的析构函数。多态性与虚函数多态性与虚

17、函数只需更改:只需更改:课堂练习课堂练习1. 读程序写结果读程序写结果课堂练习课堂练习2. 读程序写结果读程序写结果课堂练习课堂练习课堂练习课堂练习3. 写一个程序,定义抽象基类写一个程序,定义抽象基类Shape,由它派生出,由它派生出3个个派生类:派生类:Circle(圆)、(圆)、Rectangle(矩形)、矩形)、Triangle(三角形),设计(三角形),设计一个一个函数函数printArea,使其可以,使其可以分别分别输出以上三者的面积,输出以上三者的面积,3个图形的数据在定义对象时给个图形的数据在定义对象时给定。定。课堂练习课堂练习作作 业业编写完整的编写完整的C+C+程序(包括程序说明和注释)程序(包括程序说明和注释)1、扩充例、扩充例7.3,使之具有如下功能,使之具有如下功能: 1) 修改该类,使之能用重载的修改该类,使之能用重载的和和运算符输入和输出复数(要运算符输入和输出复数(要删除原例中的删除原例中的show函数);函数); 2) 重载乘法和除法运算符,使之能执行两个复数的代数乘法和代重载乘法和除法运算符,使之能执行两个复数的代数乘法和代数除法运算;数除法运算; 3) 重载运算符重载运算符=和和!=,使之能比较两个复数;,使之能比较两个复数;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论