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

上传人:文库蛋蛋多 文档编号:2802041 上传时间:2023-02-25 格式:PPT 页数:46 大小:105.02KB
返回 下载 相关 举报
学习课件教学课件PPT面向对象程序中多态性的实现.ppt_第1页
第1页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现.ppt_第2页
第2页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现.ppt_第3页
第3页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现.ppt_第4页
第4页 / 共46页
学习课件教学课件PPT面向对象程序中多态性的实现.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

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

1、第五讲 面向对象技术多态性的实现,主讲:甘玲,2023/2/25,第五讲 多态性的实现,2,内容提要,多态性的概念和多态类型 联编虚函数抽象类 运算符重载,2023/2/25,第五讲 多态性的实现,3,分析“人员信息管理”源程序:,基类的成员函数 pay()和 displayStatus()的函数体均为空,在实现部分仍要写出函数体,显得冗余。目的为了统一规定类族的基本行为。在main()函数中,建立了四个不同类的对象,对它们进行了类似的操作,但是却重复写了四遍类似的语句,程序不够简洁。是否可以依据赋值兼容规则,考虑用指向基类对象的指针数组来处理多个派生类对象呢?,2023/2/25,第五讲 多

2、态性的实现,4,赋值兼容规则,赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除了构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。公有派生类实际具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。,2023/2/25,第五讲 多态性的实现,5,赋值兼容规则,赋值兼容规则中所指“替代”:派生类的对象可以赋值给基类对象。派生类的对象可以初始化基类的引用。派生类对象的地址可以赋给基类类型的指针。,2023/2/25,第五讲 多态性的实现,6,赋值兼容规则,class B class D:public

3、 B B b1,*pb1;D d1;,根据赋值兼容规则,在基类B的对象可以使用的任何地方,均可用派生类对象来替代。,2023/2/25,第五讲 多态性的实现,7,赋值兼容规则,例5-1由于赋值兼容规则的引入,对于基类及其公有派生类的对象,就可以使用相同的函数统一进行处理(因为当函数的形参为基类的对象时,实参可以是派生类的对象。),2023/2/25,第五讲 多态性的实现,8,赋值兼容规则,根据赋值兼容规则,可以用派生类对象替代基类对象,但是,替代之后,派生类对象指针或引用仅仅能访问从基类继承下来的成员,不能能够兼容访问派生类自己的成员,这时需要虚函数等技术。,2023/2/25,第五讲 多态性

4、的实现,9,class Employee void Display();class Technician:public Employee void Display();class Salesman:virtual public Employeevoid Display();class Manager:virtual public Employeevoid Display();class SalesManager:public Manager,public Salesmanvoid Display();,Manager m1;Technician t1;Salesman s1;SalesMana

5、ger sm1;Employee*emp4=,for(int i=0;idisplay();,人员信息管理系统多态性的实现,2023/2/25,第五讲 多态性的实现,10,多态性的概念,多态性是指具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。C+的多态性是指对同一条消息,被不同类型的对象接收将产生不同的行为。多态性是实现“一种接口,多种方法”的技术。这里的“一种接口”是指相同函数名,而“多种方法”是指多种函数实现。,2023/2/25,第五讲 多态性的实现,11,多态的分类,C+支持的多态可以分为四种类型:重载多态强制多态包含多态

6、参数多态前面两种统称为专用多态,后面两种也称为通用多态。,2023/2/25,第五讲 多态性的实现,12,多态的分类,重载多态是同一个函数可以操作于不同类型的对象,函数重载和运算符重载属于重载多态;强制多态是通过语义操作把一个变量的类型加以变化,以符合一个函数的要求,强制类型转换操作属于强制多态;,2023/2/25,第五讲 多态性的实现,13,多态的分类,包含多态是研究类族中定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现;参数多态与类属相关联,类属是一个可以参数化的模板,其中包含的操作所涉及的类型必须用类型参数实例化,这样,由类属实例化的各类都具有相同的操作,而操作对象的类型却

7、各不相同,类模板属于参数多态。,2023/2/25,第五讲 多态性的实现,14,多态的分类,从实现的角度来划分,多态可以分为:编译时的多态运行时的多态,2023/2/25,第五讲 多态性的实现,15,联编,多态性的实现过程中,确定调用哪个同名函数的过程就是联编(binding),又称绑定。联编是指计算机程序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程。用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。按照联编进行的阶段的不同,可以分为静态联编和动态联编,这两种联编过程分别对应着多态性的两种实现方式。,2023/2/25,第五讲 多态性的实现,16,静态联

8、编:例5-1,在编译阶段完成的联编称为静态联编。在编译过程中,编译系统可以根据类型匹配等特征来确定程序中调用操作与执行某个同名函数实现之间的关系,即确定某一个同名函数到底是要调用哪一段函数实现代码。函数重载和运算符重载就是通过静态联编方式实现的编译时的多态的体现。静态联编的优点是函数调用速度快、效率较高,缺点是编程不够灵活。,2023/2/25,第五讲 多态性的实现,17,动态联编,只有在运行程序时才能确定将要调用的函数。这种在运行阶段进行的联编称为动态联编。动态联编的优点是提供了更好的编程灵活性、问题抽象性和程序易维护性,缺点是与静态联编相比,函数调用速度慢。例5-2(用对象指针调用虚函数实

9、现动态联编)例5-3(用对象引用调用虚函数实现动态联编),2023/2/25,第五讲 多态性的实现,18,虚函数实现包含多态,虚函数是动态联编的基础。虚函数是非静态的成员函数,经过派生之后,虚函数在类族中可以实现运行时的多态性。,2023/2/25,第五讲 多态性的实现,19,虚函数的声明,虚函数是一个在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。声明虚函数的格式如下:,virtual();,2023/2/25,第五讲 多态性的实现,20,虚函数的使用,如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的函数实现。一个函数一旦被声明为虚

10、函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都保持虚函数特性。因此,在派生类中重新定义该函数时,可以省略关键字virtual。但是,为了提高程序的可读性,往往不省略。,2023/2/25,第五讲 多态性的实现,21,注意:,只有通过对象指针或对象引用来调用虚函数,才能实现动态联编。如果采用对象来调用虚函数,则采用的是静态联编方式!,2023/2/25,第五讲 多态性的实现,22,抽象类,抽象类是一种特殊的类,专门作为基类派生新类,自身无法实例化,也就是无法定义抽象类的对象,它为一类族提供统一的操作界面。抽象类是为了抽象和设计的目的而建立的,可以说,建立抽象类,就是为了通过它多态

11、地使用其中的成员函数。抽象类处于类层次的上层,由它派生新类,然后再实例化。,2023/2/25,第五讲 多态性的实现,23,抽象类与纯虚函数,纯虚函数是一个在抽象类中声明的虚函数,只给出了函数声明而没有具体实现内容,要求各派生类根据实际需要定义自己的内容。,2023/2/25,第五讲 多态性的实现,24,纯虚函数,纯虚函数在声明时要在函数原型的后面赋0。声明纯虚函数的一般格式如下:virtual()=0;声明为纯虚函数之后,抽象类中就不再给出函数的实现部分。,2023/2/25,第五讲 多态性的实现,25,抽象类与纯虚函数,例5-5示例纯虚函数及抽象类。计算图形面积。,2023/2/25,第五

12、讲 多态性的实现,26,抽象类,抽象类只能用作其他类的基类,不能建立抽象类对象。抽象类不能用作参数类型、函数返回值类型或显式转换的类型,但可以说明指向抽象类的指针或引用,该指针或引用可以指向抽象类的派生类,进而实现多态性。抽象类主要作用是将有关的派生类组织在一个继承层次结构中,由抽象类为它们提供一个公共的根,相关的派生类就从这个根派生出来。,2023/2/25,第五讲 多态性的实现,27,练习,某高校规定,教授的基本工资为3000元,课时津贴每节课40元;副教授的基本工资为2500元,课时津贴每节课35元;讲师的基本工资为2000元,课时津贴每节课25元。用抽象类的方式编写某教师的月工资收入。

13、用虚函数和抽象类去修改“人员信息管理”(第五讲例)。,2023/2/25,第五讲 多态性的实现,28,运算符重载实现重载多态,运算符重载就是赋予系统预定义的运算符多重含义,使同一个运算符作用于不同类型的数据导致不同的行为。运算符重载的实质就是函数重载。运算符重载使得系统预定义的运算符能作用于用户自定义类型的数据(如对象等),进行类似运算。,2023/2/25,第五讲 多态性的实现,29,运算符重载规则,C+的运算符除了少数几个之外,全部可以重载,而且只能重载已有的运算符,不可臆造新的运算符。重载之后运算符的优先级和结合性都不会改变,并且要保持原运算符的语法结构。参数和返回值类型可以重新说明。运

14、算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。运算符重载有两种方式:重载为类的成员函数和重载为类的友元函数。,2023/2/25,第五讲 多态性的实现,30,当运算符重载为类的成员函数时,由于单目运算除了对象以外没有其它参数,因此重载“+”和“-”运算符,不能区分是前缀操作还是后缀操作。C+约定,在参数表中放上一个整型参数,表示后缀运算符。,重载“+”和“-”前缀和后缀的区分,2023/2/25,第五讲 多态性的实现,31,不能重载的运算符,不能重载的运算符只有六个,它们是成员访问运算符“.”、成员指针运算符“*”和“-”、作用域运算符“:”、sizeof运算符和三目运算符“

15、?:”。前面三个运算符保证了C+中访问成员功能的含义不被改变。作用域运算符和sizeof运算符的操作数是数据类型,而不是普通的表达式,也不具备重载的特征。,2023/2/25,第五讲 多态性的实现,32,运算符重载为成员函数,运算符重载为类的成员函数的一般格式如下:其中,operator是定义运算符重载函数的关键字。中最多有一个形参。,operator();,与函数重载的区别,2023/2/25,第五讲 多态性的实现,33,运算符重载为成员函数,运算符重载为成员函数后,它就可以自由地访问类的所有成员。实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,左操作数一定是对象本身

16、,由this指针给出,另一个操作数则需要通过运算符重载函数的参数表来传递;如果是单目运算符,操作数由对象的this指针给出,就不再需要任何参数。,2023/2/25,第五讲 多态性的实现,34,例5-6示例运算符重载(重载为成员函数),2023/2/25,第五讲 多态性的实现,35,存储分配的重载,通过对new和delete的重载,能够在其外部定义库函数的通用算法的基础上,提高特定情况下的效率,用户可以定制自己的内存分配方案,其一般的格式如下:,void*operator new(unsigned int size)/size的值是存放对象所需字节数 return pointer_to_mem

17、ory;/为对象分配空间时,会自动调用构造函数,2023/2/25,第五讲 多态性的实现,36,存储分配的重载,void operator delete(void*p)/释放指针p所指内存/释放指针p指向的空间,对象失效时会自动调用析构函数,2023/2/25,第五讲 多态性的实现,37,存储分配的重载,虽然new和delete重载存在两种方式:全局重载方式和一个类的局部重载方式。但一般都是对一个类进行重载,也就是把重载运算符函数说明为类的成员函数。,2023/2/25,第五讲 多态性的实现,38,运算符重载为友元函数,关于友元:友元不是类的成员,但可以访问类中的所有成员。友元分为:友元函数友

18、元类,2023/2/25,第五讲 多态性的实现,39,友元,根据封装性,一般将类中的数据成员声明为私有成员,外部可以通过类的公有成员函数对私有成员进行访问。但有时类体外的一些函数需要直接访问类的数据成员,又不改变其数据成员的访问权限,这时,需要定义友元。,2023/2/25,第五讲 多态性的实现,40,友元的作用,友元提供了不同类或对象的成员函数之间、类的成员函数与普通函数之间进行数据共享的机制。友元可以访问类中所有成员,但不是类的成员。友元虽然不是类的成员,但它是类的朋友,可以直接访问类的所有成员。,2023/2/25,第五讲 多态性的实现,41,友元的定义,如果友元是普通函数或另一个类的成

19、员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都成为友元函数。友元函数和友元类在被访问的类中声明,其格式分别如下:,friend();,friend;,2023/2/25,第五讲 多态性的实现,42,示例友元.cpp,2023/2/25,第五讲 多态性的实现,43,运算符重载为友元函数,运算符重载为类的友元函数的一般格式如下:其中,最多有两个形参。例5-7(重载为友元函数),friend operator();,2023/2/25,第五讲 多态性的实现,44,运算符重载为友元函数,与成员运算符函数的主要区别在于其参数个数不同。不用友员重载时,成员函数通过this指针传递给运算符左边的操作数,而友元函数则没有this指针,必须显式传递所有参数。例如:friend Complex operator+(double,Complex,2023/2/25,第五讲 多态性的实现,45,练习,设计两个类,点(Point)、圆(Circle)。要求:(1)点具有坐标x、y属性,获取属性和移动等方法;(2)圆从点派生,具有point、r(半径)属性,获取属性和计算圆面积等方法。再对点类(Point)以友元函数的形式重载“”运算符。,2023/2/25,第五讲 多态性的实现,46,结语,小结下讲介绍“模板及标准模板库STL”。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号