学习课件教学课件PPT面向对象程序中多态性的实现

上传人:沈*** 文档编号:170882907 上传时间:2022-11-23 格式:PPT 页数:46 大小:115.54KB
收藏 版权申诉 举报 下载
学习课件教学课件PPT面向对象程序中多态性的实现_第1页
第1页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现_第2页
第2页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现_第3页
第3页 / 共46页
资源描述:

《学习课件教学课件PPT面向对象程序中多态性的实现》由会员分享,可在线阅读,更多相关《学习课件教学课件PPT面向对象程序中多态性的实现(46页珍藏版)》请在装配图网上搜索。

1、2022-11-23第五讲 多态性的实现2 多态性的概念和多态类型多态性的概念和多态类型 联编联编 虚函数虚函数 抽象类抽象类 运算符重载运算符重载2022-11-23第五讲 多态性的实现3“”基类的成员函数基类的成员函数 pay()和和 displayStatus()的函数体均为的函数体均为空空,在实现部分仍要写出函数,在实现部分仍要写出函数体,显得体,显得冗余冗余。目的为了统一规定类族的基。目的为了统一规定类族的基本行为。本行为。在在main()()函数中,建立了四个不同类的对象,函数中,建立了四个不同类的对象,对它们进行了类似的操作,但是却对它们进行了类似的操作,但是却重复写了重复写了四

2、遍类似的语句四遍类似的语句,程序不够简洁。是否可以,程序不够简洁。是否可以依据依据赋值兼容规则赋值兼容规则,考虑用指向基类对象的,考虑用指向基类对象的指针数组来处理多个派生类对象呢?指针数组来处理多个派生类对象呢?2022-11-23第五讲 多态性的实现4 赋值兼容规则是赋值兼容规则是指在需要基类对象的任何地指在需要基类对象的任何地方都可以使用公有派生类的对象来替代方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除了构通过公有继承,派生类得到了基类中除了构造函数、析构函数之外的所有成员,而且所造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。有成员

3、的访问控制属性也和基类完全相同。公有派生类实际具备了基类的所有功能公有派生类实际具备了基类的所有功能,凡,凡是基类能解决的问题,公有派生类都可以解是基类能解决的问题,公有派生类都可以解决。决。2022-11-23第五讲 多态性的实现5 赋值兼容规则中所指赋值兼容规则中所指“替代替代”:派生类的对象可以派生类的对象可以赋值给基类赋值给基类对象对象。派生类的对象可以派生类的对象可以初始化基类的初始化基类的引用引用。派生类对象的地址可以派生类对象的地址可以赋给基类类型的赋给基类类型的指针指针。2022-11-23第五讲 多态性的实现6class B class D:public B B b1,*pb

4、1;D d1;l根据赋值兼容规则,在基类根据赋值兼容规则,在基类B的对象可以使用的对象可以使用的任何地方,均可用派生类对象来替代。的任何地方,均可用派生类对象来替代。pb1=&b1;pb1=&d1;即基类指针可以指向派生类对象即基类指针可以指向派生类对象2022-11-23第五讲 多态性的实现7 例例5-1 由于赋值兼容规则的引入,对于由于赋值兼容规则的引入,对于基类及其基类及其公有派生类的对象公有派生类的对象,就可以使用,就可以使用相同的函相同的函数数统一进行处理(因为当函数的形参为基统一进行处理(因为当函数的形参为基类的对象时,实参可以是派生类的对象。)类的对象时,实参可以是派生类的对象。

5、)2022-11-23第五讲 多态性的实现8 根据赋值兼容规则,可以根据赋值兼容规则,可以用派生类对象替用派生类对象替代基类对象代基类对象,但是,替代之后,派生类对,但是,替代之后,派生类对象指针或引用象指针或引用仅仅能访问从基类继承下来仅仅能访问从基类继承下来的成员的成员,不能能够兼容访问派生类自己的,不能能够兼容访问派生类自己的成员,这时成员,这时需要虚函数需要虚函数等技术。等技术。2022-11-23第五讲 多态性的实现9class Employee void Display();class Technician:public Employee void Display();class

6、Salesman:virtual public Employeevoid Display();class Manager:virtual public Employeevoid Display();class SalesManager:public Manager,public Salesmanvoid Display();Manager m1;Technician t1;Salesman s1;SalesManager sm1;Employee*emp4=&m1,&t1,&s1,&sm1;for(int i=0;idisplay();人员信息管理系统人员信息管理系统多态性的实现多态性的实现2

7、022-11-23第五讲 多态性的实现10 多态性是指具有相似功能的多态性是指具有相似功能的不同函数不同函数使用使用同一个同一个名称名称来实现,从而可以使用来实现,从而可以使用相同的调用方式相同的调用方式来调来调用这些具有用这些具有不同功能不同功能的同名函数的特性。的同名函数的特性。C+的多态性是指的多态性是指对同一条消息,被不同类型的对对同一条消息,被不同类型的对象接收将产生不同的行为象接收将产生不同的行为。多态性是实现多态性是实现“一种接口,多种方法一种接口,多种方法”的技术。的技术。这里的这里的“一种接口一种接口”是指相同函数名,而是指相同函数名,而“多种多种方法方法”是指多种函数实现。

8、是指多种函数实现。2022-11-23第五讲 多态性的实现11 C+支持的多态可以分为四种类型:支持的多态可以分为四种类型:重载多态重载多态 强制多态强制多态 包含多态包含多态 参数多态参数多态 前面两种统称为前面两种统称为专用多态专用多态,后面两种也称,后面两种也称为为通用多态通用多态。2022-11-23第五讲 多态性的实现12 重载多态重载多态是同一个函数可以操作于不同是同一个函数可以操作于不同类型的对象,类型的对象,函数重载和运算符重载函数重载和运算符重载属属于重载多态;于重载多态;强制多态强制多态是通过语义操作把一个变量的是通过语义操作把一个变量的类型加以变化,以符合一个函数的要求,

9、类型加以变化,以符合一个函数的要求,强制类型转换强制类型转换操作属于强制多态;操作属于强制多态;2022-11-23第五讲 多态性的实现13 包含多态包含多态是研究类族中定义于不同类中的是研究类族中定义于不同类中的同名成员函数的多态行为,主要通过同名成员函数的多态行为,主要通过虚函虚函数数来实现;来实现;参数多态参数多态与类属相关联,类属是一个可以与类属相关联,类属是一个可以参数化的模板,其中包含的操作所涉及的参数化的模板,其中包含的操作所涉及的类型必须用类型参数实例化,这样,由类类型必须用类型参数实例化,这样,由类属实例化的各类都具有相同的操作,而操属实例化的各类都具有相同的操作,而操作对象

10、的类型却各不相同,作对象的类型却各不相同,类模板类模板属于参属于参数多态。数多态。2022-11-23第五讲 多态性的实现14 从从实现实现的角度来划分,多态可以分为:的角度来划分,多态可以分为:编译编译时的多态时的多态 运行运行时的多态时的多态2022-11-23第五讲 多态性的实现15 多态性的实现过程中,确定调用哪个同名函数的多态性的实现过程中,确定调用哪个同名函数的过程就是过程就是联编联编(binding),又称绑定。),又称绑定。联编是指计算机程序自身彼此关联的过程,也就联编是指计算机程序自身彼此关联的过程,也就是把一个是把一个标识符名标识符名和一个和一个存储地址存储地址联系在一起的

11、联系在一起的过程。过程。用面向对象的术语讲,就是把一条消息和一个对用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。象的方法相结合的过程。按照联编进行的阶段的不同,可以分为按照联编进行的阶段的不同,可以分为静态联编静态联编和和动态联编动态联编,这两种联编过程分别对应着多态性,这两种联编过程分别对应着多态性的两种实现方式。的两种实现方式。2022-11-23第五讲 多态性的实现16 在在编译编译阶段完成的联编称为阶段完成的联编称为静态联编静态联编。在编译过程中,编译系统可以根据类型匹配等特在编译过程中,编译系统可以根据类型匹配等特征来确定程序中调用操作与执行某个同名函数实征来确定程

12、序中调用操作与执行某个同名函数实现之间的关系,即确定某一个同名函数到底是要现之间的关系,即确定某一个同名函数到底是要调用哪一段函数实现代码。调用哪一段函数实现代码。函数重载和运算符重载就是通过静态联编方式实函数重载和运算符重载就是通过静态联编方式实现的编译时的多态的体现。现的编译时的多态的体现。静态联编的优点是函数调用速度快、效率较高,静态联编的优点是函数调用速度快、效率较高,缺点是编程不够灵活。缺点是编程不够灵活。2022-11-23第五讲 多态性的实现17 只有在运行程序时才能确定将要调用的函数。这只有在运行程序时才能确定将要调用的函数。这种在运行阶段进行的联编称为动态联编。种在运行阶段进

13、行的联编称为动态联编。动态联编的优点是提供了更好的编程灵活性、问动态联编的优点是提供了更好的编程灵活性、问题抽象性和程序易维护性,缺点是与静态联编相题抽象性和程序易维护性,缺点是与静态联编相比,函数调用速度慢。比,函数调用速度慢。例例5-2(用对象指针调用虚函数实现动态联编)(用对象指针调用虚函数实现动态联编)例例5-3(用对象引用调用虚函数实现动态联编)(用对象引用调用虚函数实现动态联编)2022-11-23第五讲 多态性的实现18 虚函数是动态联编的基础。虚函数是动态联编的基础。虚函数是非静态的成员函数,经过派生虚函数是非静态的成员函数,经过派生之后,虚函数在类族中可以实现运行时之后,虚函

14、数在类族中可以实现运行时的多态性。的多态性。2022-11-23第五讲 多态性的实现19 虚函数是一个在某基类中声明为虚函数是一个在某基类中声明为virtual并在一个或多个派生类中被重新定义的成并在一个或多个派生类中被重新定义的成员函数。声明虚函数的格式如下:员函数。声明虚函数的格式如下:virtualvirtual (););2022-11-23第五讲 多态性的实现20 如果某类中的一个成员函数被说明为如果某类中的一个成员函数被说明为虚函数虚函数,这就这就意味着意味着该成员函数该成员函数在派生类中可能有不同在派生类中可能有不同的函数实现。的函数实现。一个函数一旦被声明为虚函数,则无论声明它

15、一个函数一旦被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函的类被继承了多少层,在每一层派生类中该函数都数都保持虚函数特性保持虚函数特性。因此,在派生类中重新。因此,在派生类中重新定义该函数时,可以定义该函数时,可以省略省略关键字关键字virtual。但是,。但是,为了提高程序的可读性,往往不省略。为了提高程序的可读性,往往不省略。2022-11-23第五讲 多态性的实现21 只有通过只有通过对象指针对象指针或或对象引用对象引用来来调用虚函调用虚函数数,才能实现,才能实现动态联编动态联编。如果采用。如果采用对象对象来来调用虚函数,则采用的是调用虚函数,则采用的是静态联编静态

16、联编方方式式!2022-11-23第五讲 多态性的实现22 抽象类是一种特殊的类,专门作为基类派生新抽象类是一种特殊的类,专门作为基类派生新类,自身无法实例化,也就是无法定义抽象类类,自身无法实例化,也就是无法定义抽象类的对象,它为一类族提供统一的操作界面。的对象,它为一类族提供统一的操作界面。抽象类是为了抽象和设计的目的而建立的,可抽象类是为了抽象和设计的目的而建立的,可以说,建立抽象类,就是为了通过它多态地使以说,建立抽象类,就是为了通过它多态地使用其中的成员函数。用其中的成员函数。抽象类处于类层次的上层,由它派生新类,然抽象类处于类层次的上层,由它派生新类,然后再实例化。后再实例化。20

17、22-11-23第五讲 多态性的实现23 纯虚函数是一个纯虚函数是一个在抽象类中在抽象类中声明的虚函数,声明的虚函数,只给出了函数声明而没有具体实现内容,只给出了函数声明而没有具体实现内容,要求各派生类根据实际需要定义自己的内要求各派生类根据实际需要定义自己的内容。容。2022-11-23第五讲 多态性的实现24 纯虚函数在声明时要在函数原型的后面赋纯虚函数在声明时要在函数原型的后面赋0。声明纯虚函数的一般格式如下:。声明纯虚函数的一般格式如下:virtual ()=0;声明为纯虚函数之后,抽象类中就不再给声明为纯虚函数之后,抽象类中就不再给出函数的实现部分。出函数的实现部分。2022-11-

18、23第五讲 多态性的实现25 例例5-5示例纯虚函数及抽象类。计算示例纯虚函数及抽象类。计算图形面积。图形面积。2022-11-23第五讲 多态性的实现26 抽象类抽象类只能用作只能用作其他类的基类,不能建立抽象类其他类的基类,不能建立抽象类对象。对象。抽象类抽象类不能用作不能用作参数类型、函数返回值类型或显参数类型、函数返回值类型或显式转换的类型,但可以说明指向抽象类的指针或式转换的类型,但可以说明指向抽象类的指针或引用,该指针或引用可以指向抽象类的派生类,引用,该指针或引用可以指向抽象类的派生类,进而实现多态性。进而实现多态性。抽象类抽象类主要作用主要作用是将有关的派生类组织在一个继是将有

19、关的派生类组织在一个继承层次结构中,由抽象类为它们提供一个公共的承层次结构中,由抽象类为它们提供一个公共的根,相关的派生类就从这个根派生出来。根,相关的派生类就从这个根派生出来。2022-11-23第五讲 多态性的实现27 某高校规定,教授的基本工资为某高校规定,教授的基本工资为3000元,元,课时津贴每节课课时津贴每节课40元;副教授的基本工资元;副教授的基本工资为为2500元,课时津贴每节课元,课时津贴每节课35元;讲师元;讲师的基本工资为的基本工资为2000元,课时津贴每节课元,课时津贴每节课25元。用抽象类的方式编写某教师的月工元。用抽象类的方式编写某教师的月工资收入。资收入。用虚函数

20、和抽象类去修改用虚函数和抽象类去修改“人员信息管理人员信息管理”(第五讲例)。(第五讲例)。2022-11-23第五讲 多态性的实现28 运算符重载就是运算符重载就是赋予系统预定义的运算符赋予系统预定义的运算符多重含义多重含义,使同一个运算符作用于不同类,使同一个运算符作用于不同类型的数据导致不同的行为。型的数据导致不同的行为。运算符重载的运算符重载的实质就是函数重载实质就是函数重载。运算符重载使得系统预定义的运算符能运算符重载使得系统预定义的运算符能作作用用于于用户自定义类型的数据(如对象等)用户自定义类型的数据(如对象等),进行类似运算。进行类似运算。2022-11-23第五讲 多态性的实

21、现29 C+的运算符除了少数几个之外,全部可以重载,的运算符除了少数几个之外,全部可以重载,而且而且只能重载已有的只能重载已有的运算符,运算符,不可臆造不可臆造新的运新的运算符。算符。重载之后运算符的重载之后运算符的优先级和结合性都不会改变优先级和结合性都不会改变,并且要并且要保持保持原运算符的原运算符的语法结构语法结构。参数和返回。参数和返回值类型可以重新说明。值类型可以重新说明。运算符重载是针对新类型数据的实际需要,对运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。原有运算符进行适当的改造。运算符重载有两种方式:重载为类的运算符重载有两种方式:重载为类的成员函数成员函数和

22、重载为类的和重载为类的友元函数友元函数。2022-11-23第五讲 多态性的实现30 当运算符重载为类的成员函数时,由于单当运算符重载为类的成员函数时,由于单目运算除了对象以外没有其它参数,因此目运算除了对象以外没有其它参数,因此重载重载“+”和和“-”运算符,不能区分是运算符,不能区分是前缀操作还是后缀操作。前缀操作还是后缀操作。C+约定,在参约定,在参数表中放上一个整型参数,表示后缀运算数表中放上一个整型参数,表示后缀运算符。符。2022-11-23第五讲 多态性的实现31 不能重载的运算符只有六个,它们是成员不能重载的运算符只有六个,它们是成员访问运算符访问运算符“.”、成员指针运算符、

23、成员指针运算符“*”和和“-”、作用域运算符、作用域运算符“:”、sizeof运算运算符和三目运算符符和三目运算符“?:”。前面前面三三个运算符保证了个运算符保证了C+中访问成员功中访问成员功能的含义不被改变。作用域运算符和能的含义不被改变。作用域运算符和sizeof运算符的操作数是数据类型,而不运算符的操作数是数据类型,而不是普通的表达式,也不具备重载的特征。是普通的表达式,也不具备重载的特征。2022-11-23第五讲 多态性的实现32 运算符重载为类的成员函数的一般格式如下:运算符重载为类的成员函数的一般格式如下:其中,其中,operator是定义运算符重载函数的关键字。是定义运算符重载

24、函数的关键字。中最多有一个形参中最多有一个形参。operator operator();与函数重与函数重载的区别载的区别2022-11-23第五讲 多态性的实现33 运算符重载为成员函数后,它就运算符重载为成员函数后,它就可以自由可以自由地访问类的所有成员地访问类的所有成员。实际使用时,总是。实际使用时,总是通过该类的某个对象来访问重载的运算符通过该类的某个对象来访问重载的运算符。如果是如果是双目双目运算符,运算符,左操作数一定是对象左操作数一定是对象本身本身,由,由thisthis指针给出,另一个操作数则指针给出,另一个操作数则需要通过运算符重载函数的参数表来传递;需要通过运算符重载函数的参

25、数表来传递;如果是如果是单目单目运算符,操作数由对象的运算符,操作数由对象的thisthis指针给出,就指针给出,就不不再再需需要任何要任何参数参数。2022-11-23第五讲 多态性的实现34 例例5-6示例运算符重载(重载为成员示例运算符重载(重载为成员函数)函数)2022-11-23第五讲 多态性的实现35 通过对通过对new和和delete的重载,能够在其外部的重载,能够在其外部定义库函数的通用算法的基础上,提高特定义库函数的通用算法的基础上,提高特定情况下的效率,用户可以定制自己的内定情况下的效率,用户可以定制自己的内存分配方案,其一般的格式如下:存分配方案,其一般的格式如下:voi

26、d void*operator new(unsigned int operator new(unsigned int size)size)/size /size的值是存放对象所需字节数的值是存放对象所需字节数 return pointer_to_memory return pointer_to_memory;/为对象分配空间时,会自动调用构造函数为对象分配空间时,会自动调用构造函数2022-11-23第五讲 多态性的实现36void operator delete(void*p)/释放指针释放指针p所指内存所指内存 /释放指针释放指针p指向的空间,对象失效时指向的空间,对象失效时会自动调用析构

27、函数会自动调用析构函数 2022-11-23第五讲 多态性的实现37 虽然虽然new和和delete重载存在两种方式:重载存在两种方式:全局重载方式和一个类的局部重载方全局重载方式和一个类的局部重载方式。但一般都是对一个类进行重载,式。但一般都是对一个类进行重载,也就是把重载运算符函数说明为也就是把重载运算符函数说明为类的类的成员函数成员函数。2022-11-23第五讲 多态性的实现38 关于友元:友元不是类的成员,关于友元:友元不是类的成员,但可以访问类中的所有成员。但可以访问类中的所有成员。友元分为:友元分为:友元函数友元函数友元类友元类2022-11-23第五讲 多态性的实现39 根据封

28、装性,一般将类中的数据成员声明根据封装性,一般将类中的数据成员声明为私有成员,外部可以通过类的公有成员为私有成员,外部可以通过类的公有成员函数对私有成员进行访问。函数对私有成员进行访问。但有时类体外的一些函数需要直接访问类但有时类体外的一些函数需要直接访问类的数据成员,又不改变其数据成员的访问的数据成员,又不改变其数据成员的访问权限,这时,需要定义友元。权限,这时,需要定义友元。2022-11-23第五讲 多态性的实现40 友元提供了不同类或对象的成员函数之间、友元提供了不同类或对象的成员函数之间、类的成员函数与普通函数之间进行数据共类的成员函数与普通函数之间进行数据共享的机制。享的机制。友元

29、友元可以访问类中所有成员,但可以访问类中所有成员,但不是类的不是类的成员成员。友元虽然不是类的成员,但它是类的朋友,友元虽然不是类的成员,但它是类的朋友,可以直接访问类的所有成员可以直接访问类的所有成员。2022-11-23第五讲 多态性的实现41 如果友元是普通函数或另一个类的成员函如果友元是普通函数或另一个类的成员函数,称为友元函数;如果友元是一个类,数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都则称为友元类,友元类的所有成员函数都成为友元函数。友元函数和友元类在被访成为友元函数。友元函数和友元类在被访问的类中声明,其格式分别如下:问的类中声明,其格式分别如下:f

30、riend ();friend;2022-11-23第五讲 多态性的实现42 示例友元示例友元.cpp2022-11-23第五讲 多态性的实现43 运算符重载为类的友元函数的一般格式如下:运算符重载为类的友元函数的一般格式如下:其中,其中,最多有两个形参。最多有两个形参。例例5-7(重载为友元函数)(重载为友元函数)friend friend operator operator();2022-11-23第五讲 多态性的实现44 与成员运算符函数的主要区别在于其与成员运算符函数的主要区别在于其参数个数参数个数不同。不用不同。不用友员重载时,成员函数通过友员重载时,成员函数通过this指针传递给运

31、算符左边的指针传递给运算符左边的操作数,而友元函数则没有操作数,而友元函数则没有this指针,必须指针,必须显式传递所有显式传递所有参数参数。例如:。例如:friend Complex operator+(double,Complex&);friend Complex operator-(Complex&);2022-11-23第五讲 多态性的实现45 设计两个类,点(设计两个类,点(Point)、圆()、圆(Circle)。)。要求:要求:(1)点具有坐标)点具有坐标x、y属性,获取属性和属性,获取属性和移动等方法;移动等方法;(2)圆从点派生,具有)圆从点派生,具有point、r(半径)(半径)属性,获取属性和计算圆面积等方法。属性,获取属性和计算圆面积等方法。再对点类(再对点类(Point)以友元函数的形式重)以友元函数的形式重载载“”运算符。运算符。2022-11-23第五讲 多态性的实现46 小结小结 下讲介绍下讲介绍“模板及标准模板库模板及标准模板库STL”。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!