欢迎来到天天文库
浏览记录
ID:51995417
大小:1.47 MB
页数:63页
时间:2020-03-27
《多态性虚函数运算符重载.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章多态性和虚函数6.1多态性6.2虚函数6.3纯虚函数和抽象类6.4虚析构函数多态性什么是多态性?同一个消息被不同对象接收时,产生不同的结果。即采用不同方法实现同一接口。ABCabcf()f()f()多态性的定义定义:同一个函数名,实现不同的功能。相同名字函数在不同场合表现出不同行为。调用时,系统根据不同的参数或对象所属的类来调用相应的函数,实现动态的结合。C++支持两种多态性:编译时的多态---通过函数重载和运算符重载来实现。运行时的多态---通过继承和虚函数来实现。联编定义:使一个程序经过编译、连接,成为可执行文件的过程。静态联编---在程序运行之前就完成的联编。系统在编
2、译时就知道调用函数的全部信息,函数调用速度快、效率高。动态联编---在程序运行时才能完成的联编。直到程序运行时才能确定调用哪个函数,灵活性、问题抽象性和程序易维护性。两种多态性静态联编支持的多态性,称编译时的多态性,通过函数重载和运算符重载来实现。动态联编支持的多态性,称运行时的多态性,通过继承和虚函数来实现运行时的多态性通过虚函数和纯虚函数来实现。在基类,定义派生类所拥有的通用接口。例如,在基类中定义名为f()的纯虚函数。在派生类,定义具体的实现方法。所有派生类中都定义了名为f()的虚函数,不同派生类的f()具有不同的功能。实现运行时的多态性。在程序中使用基类指针调用f(),直
3、到程序运行时,系统才能确定调用哪一个函数,基类指针指向哪个派生类,就调用哪个派生类。6.2虚函数6.2.1为什么要引入虚函数6.2.2虚函数的定义与使用6.2.1为什么要引入虚函数指向基类对象的指针都可以指向它的公有派生类对象,若试图指向它的私有派生类对象是被禁止的。不能将一个声明为指向派生类对象的指针指向其基类的一个对象。指向派生类的指针不能继承。也就是说,基类的指针可以指向它的派生类,但不能再指向它的派生类的派生类。声明为指向基类对象的指针,当它指向公有派生类对象时,只能利用它来直接访问派生类中从基类继承来的成员,不能直接访问公有派生类中特定的成员。若想访问其公有派生类的特定
4、成员,可以将基类指针显式类型转换为派生类指针来实现。6.2.2虚函数的定义与使用1.虚函数的定义虚函数是引入了派生概念后,用来表现基类和派生类的成员函数之间的一种关系的。虚函数定义是在基类中进行的(virtual),虚函数提供了一种接口界面。在基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义。在派生类中重新定义虚函数时,都必须与基类中的原型完全相同。虚函数是一种非静态的成员函数,说明虚函数的方法如下:virtual〈类型〉〈函数名〉(〈参数表〉)6.2.2虚函数的定义与使用如果在基类中定义了一个虚函数,该虚函数可以在它的一个或多个派生类中重载,不
5、用冠以virtual也自动成为虚函数。举例虚函数的使用说明在基类中,使用关键字virtual。把public和protected部分的成员函数声明为虚函数。在派生类中重新定义虚函数时,函数的返值类型和参数应该同基类中的虚函数完全一致。如果参数不同,属于一般的函数重载,不自动为虚函数。如果仅返值类型不同,产生一个错误,既非重载函数,也非虚函数。举例虚函数的使用说明虚函数的重载函数仍是虚函数。若在基类中声明了一个虚函数,派生类重载该成员函数时无需使用virtual,重载的成员函数自动成为虚函数。若在派生类中没有重新定义虚函数,派生类对象将使用从基类继承的虚函数。虚函数必须是类的成员函
6、数,不能是友元函数,也不能是静态成员函数。析构函数可以是虚函数,但是构造函数不可以是虚函数。虚函数的使用说明如果基类中定义了虚函数,使用基类指针调用基类的一个虚函数时,C++系统对该调用进行动态绑定,根据指针当前指向的对象类型,来确定该调用的函数。然而,调用普通函数时,则是静态绑定,编译时就确定该调用的函数。在多重继承下,对虚函数的调用与单一继承的情况相似。(举例)举例结果不同运行时的多态性的作用运行时的多态性,使得我们可以使用基类指针分别指向多个不同派生类的对象,以此来调用不同功能的函数。举例举例空的虚函数派生类并不一定必须实现基类中的虚函数,如果派生类想通过虚函数机制存取虚函
7、数,则必须建立一条从基类到派生类的虚函数路径。许多没有使用虚函数的中间类也必须声明该函数,以保证其后的派生类能使用该虚函数。可以通过声明空函数来达到此目的。空的虚函数(举例)#includeclassBase{public:virtualvoidprint(){cout<<“classbase!”;}}classSon:publicbase{public:virtualvoidprint(){}};classGrandson:publicson{pub
此文档下载收益归作者所有