C程序设计《多态性与虚函数》.ppt
《C程序设计《多态性与虚函数》.ppt》由会员分享,可在线阅读,更多相关《C程序设计《多态性与虚函数》.ppt(29页珍藏版)》请在三一办公上搜索。
1、1,C+程序设计,多态性与虚函数,2,第5章 多态性与虚函数,什么是多态性 向上类型转换 功能早绑定和晚绑定 实现功能晚绑定虚函数 纯虚函数和抽象类 学生信息管理系统中的多态性,本章学习要点,3,第5章 多态性与虚函数,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。实现“一个接口,多种方法”,4,5.1 什么是多态性,多态性可以分为4类:参数多态包含多态重载多态强制多态。,5,5.1 什么是多态性,参数多态如函数模板和类模板。由函数模板实例化的各个函数都具有相同的操作,而这些函数的参数类型却各不相同。同样地,由类
2、模板实例化的各个类都具有相同的操作,而操作对象的类型是各不相同的。,6,5.1 什么是多态性,包含多态是研究类族中定义于不同类中的同名成员函数的多态行为,主要是通过虚函数来实现的。,7,5.1 什么是多态性,重载多态如函数重载、运算符重载等。前面我们学习过的普通函数及类的成员函数的重载都属于重载多态。,8,5.1 什么是多态性,强制多态是指将一个变元的类型加以变化,以符合一个函数(或操作)的要求,例如加法运算符在进行浮点数与整型数相加时,首先进行类型强制转换,把整型数变为浮点数再相加的情况,就是强制多态的实例。,9,5.2 向上类型转换,向上类型转换是指把一个派生类的对象作为基类的对象来使用。
3、向上转型中有三点需要我们特别注意。向上类型转换是安全的。向上类型转换可以自动完成。向上类型转换的过程中会丢失子类型信息。,10,5.2 向上类型转换,【例5-1】一个向上类型转换的例子。#include using namespace std;class B0/基类B0声明public:void display()coutdisplay();/通过“对象指针-成员名”的形式调用display()成员函数int main()B0 b0;/声明B0类对象B1 b1;/声明B1类对象D1 d1;/声明D1类对象B0*p;/声明B0类指针pp=,11,5.3 功能早绑定和晚绑定,功能早绑定(编译时的多
4、态性):绑定是在程序编译阶段完成。功能早绑定时,系统用实参与形参进行匹配,对于同名的重载函数便根据参数上的差异进行区分,然后进行绑定,从而实现了编译时的多态性。功能晚绑定(运行时的多态性):绑定是在程序运行阶段完成的。即当程序调用到某一函数名时,才去寻找和连接其程序代码,对面向对象程序设计而言,就是当对象接收到某一消息时,才去寻找和连接相应的方法。,12,5.4 实现功能晚绑定虚函数,成员函数的定义语法是:virtual 函数类型 函数名(形参表)函数体,13,5.2 向上类型转换,【例5-3】有一个交通工具类vehicle,将它作为基类派生出汽车类motor_ vehicle,再将汽车类mo
5、tor_ vehicle 作为基类派生出小汽车类car和卡车类truck,声明这些类并定义一个虚函数用来显示各类信息。程序如下:#include using namespace std;class vehicle/基类vehicle声明public:virtual void message()/虚成员函数 coutvehicle message endl;private:int wheels;/车轮个数float weight;/车重;,14,5.2 向上类型转换,class motor_vehicle:public vehicle/vehicle派生类motor_vehicle声明publi
6、c:void message()cout motor_ vehicle message endl;private:int passengers;/承载人数;class car:public motor_vehicle/motor_ vehicle的派生类car声明public:void message()coutcar message endl;private:float engine;/发动机的马力数;class truck:public motor_vehicle/motor_vehicle的派生类truck声明 public:void message()cout truck messag
7、e endl;private:int loadpay;/载重量;,15,5.2 向上类型转换,int main()vehicle v,*p;/声明vehicle类对象和基类指针pmotor_vehicle m;/声明motor_ vehicle类对象car c;/声明car类对象truck t;/声明truck类对象p=,16,5.4 实现功能晚绑定虚函数,C+规定,如果在派生类中,没有用virtual显式地给出虚函数声明,这时系统就会遵循以下的规则来判断一个成员函数是不是虚函数:(1)该函数与基类的虚函数有相同的名称。(2)该函数与基类的虚函数有相同的参数个数及相同的对应参数类型。(3)该函
8、数与基类的虚函数有相同的返回类型或者满足赋值兼容规则的指针、引用型的返回类型。,17,5.4 实现功能晚绑定虚函数,说明:通过定义虚函数来使用C+提供的多态性机制时,派生类应该从它的基类公用派生。之所以有这个要求,是因为我们是在赋值兼容规则的基础上来使用虚函数的,而赋值兼容规则成立的前提条件是派生类从其基类公用派生。必须首先在基类中定义虚函数。由于“基类”与“派生类”是相对的,因此,这项说明并不表明必须在类等级的最高层类中声明虚函数。在实际应用中,应该在类等级内需要具有动态多态性的几个层次中的最高层类内首先声明虚函数。在派生类对基类中声明的虚函数进行重新定义时,关键字virtual可以写也可以
9、不写。但为了增强程序的可读性,最好在对派生类的虚函数进行重新定义时也加上关键字virtual。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。虽然使用对象名和点运算符的方式也可以调用虚函数,例如语句:c.message();可以调用虚函数car:message()。但是这种调用在编译时进行的是功能早绑定,它没有充分利用虚函数的特性。只有通过基类指针或引用访问虚函数时才能获得运行时的多态性。,18,5.4 实现功能晚绑定虚函数,一个虚函数无论被公用继承多少次,它仍然保持其虚函数的特性。虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态成员函数,因为虚函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多态性与虚函数 程序设计 多态性 函数
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6503603.html