C++第6章-虚函数和多态性课件.ppt

上传人(卖家):晟晟文业 文档编号:5183072 上传时间:2023-02-16 格式:PPT 页数:45 大小:182.50KB
下载 相关 举报
C++第6章-虚函数和多态性课件.ppt_第1页
第1页 / 共45页
C++第6章-虚函数和多态性课件.ppt_第2页
第2页 / 共45页
C++第6章-虚函数和多态性课件.ppt_第3页
第3页 / 共45页
C++第6章-虚函数和多态性课件.ppt_第4页
第4页 / 共45页
C++第6章-虚函数和多态性课件.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、1 第六章第六章 虚函数和多态性虚函数和多态性2目标目标 理解静态联编和动态联编的含义 熟练掌握虚函数的使用 掌握虚析构函数的作用 掌握抽象类 掌握多态性36.1 静态联编和动态联编静态联编和动态联编 46.1 静态联编和动态联编静态联编和动态联编 联编是指一个程序模块、代码之间的关联过程,也就是把一个标识符名和一个存储地址联系在一起的过程。按照联编进行阶段的不同,可以分为静态联编和动态联编。56.1 静态联编和动态联编静态联编和动态联编 1静态联编 所谓静态联编,是指程序之间的匹配、连接工作在编译阶段,即程序运行之前完成,也称为早期联编。函数重载和运算符重载就属于静态多态性。所谓函数重载是指

2、同一个函数名可以对应着多个函数的实现。每一种函数的实现对应相同的函数名,但是函数参数的个数不同。6【例6.1】参数个数不同的重载函数实例。#include class MaxClassprivate:int x,y,w,h;public:MaxClass(int,int,int,int);int max(int,int);int max(int,int,int);int max(int,int,int,int);void display();MaxClass:MaxClass(int a,int b,int c,int d)x=a;y=b;w=c;h=d;7int MaxClass:max(i

3、nt a,int b)x=a;y=b;return xy?x:y;int MaxClass:max(int a,int b,int c)w=c;return max(a,b)w?max(a,b):w;int MaxClass:max(int a,int b,int c,int d)h=d;return max(a,b,c)d?max(a,b,c):h;void MaxClass:display()cout四个数是:x,y,w,hendl;8void main()MaxClass mc(34,67,143,89);cout计算前两个数中的最大数为:“mc.max(34,67)endl;cout计

4、算前三个数中的最大数为:“mc.max(34,67,143)endl;cout计算四个数中的最大数为:“mc.max(34,67,143,89)endl;cout其中,;mc.display();运行结果:计算前两个数中的最大数为:67计算前三个数中的最大数为:143计算四个数中的最大数为:143其中,四个数是:34,67,143,8996.1 静态联编和动态联编静态联编和动态联编 2.动态联编 与静态联编相对应,编译程序在编译阶段不能确定将要调用的函数,只有在程序运行阶段才能确定调用的函数。在编译、连接过程中无法解决的联编问题,要等到程序开始运行之后再来确定该调用的函数,这种联编工作称为动态

5、联编,也称为晚期联编。C+的动态联编是通过虚函数和基类的指针实现的,是一种动态多态。在后面的例题中可以从中了解。106.2 虚函数虚函数 6.2.1 虚函数的定义虚函数的定义 6.2.2 虚函数与动态联编虚函数与动态联编 6.2.3 虚函数的重载虚函数的重载 6.2.4 虚析构函数虚析构函数116.2.1 虚函数的定义虚函数的定义1.引入虚函数的目的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。126.2.1 虚函数的定义虚函数的定义2.虚函数的定义 虚函数的定义是在基类中进行的。虚函数的定义语法格式如下:virtual(形参

6、表)函数体136.2.1 虚函数的定义虚函数的定义3.定义虚函数时,要注意遵循以下规则:1)只有成员函数才能声明为虚函数,因为虚函数仅适用于有继承关系的类对象,所以普通函数不能声明为虚函数。2)虚函数的声明只能出现在类声明中的函数原型声明中,而不能出现在成员的函数体实现上。3)类的静态成员函数不可以定义为虚函数,因为静态成员函数不受限于某个对象。146.2.1 虚函数的定义虚函数的定义定义虚函数时,要注意遵循以下规则:4)类的构造函数不可以定义为虚函数。多态是指不同的对象对同一消息有不同的行为特性。虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此,虚构造

7、函数是没有意义的。5)内联函数不能声明为虚函数,因为内联函数不能在运行中动态确定其位置。156.2.2 虚函数与动态联编虚函数与动态联编 虚函数是动态联编的基础,如果某个类中的一个成员函数被说明为虚函数,则当使用指针或引用所标识的对象操作这个成员函数时,对该成员函数调用采用动态联编的方式,即在运行时进行关联或束定。虚成员函数是动态联编的,即在运行时是根据对象类型而不是指向该对象的指针或引用类型选择成员函数。动态联编只能通过指针或引用所标识对象来操作虚函数。16【例6.5】使用虚函数例题。#include#include static int Line=1;class CAnimal /定义基类

8、CAnimalprotected:char*name;public:CAnimal(char*na)name=new charstrlen(na)+1;strcpy(name,na);virtual void display()/虚函数声明cout(Line+):动物(食草/食肉).endl;17class CHerbivorous:public CAnimal/定义派生类CHerbivorous public:CHerbivorous(char*na):CAnimal(na)void display()/重新定义虚函数cout(Line+):食草动物:nameendl;/定义派生类CCarn

9、ivore(食肉动物)class CCarnivore:public CAnimalpublic:CCarnivore(char*na):CAnimal(na)void display()/重新定义虚函数cout(Line+):食肉动物:namedisplay();ptrAni=&herb;ptrAni-display();(CHerbivorous*)ptrAni)-display();ptrAni=&carn;ptrAni-display();(CCarnivore*)ptrAni)-display();herb.display();carn.display();运行结果:(1):动物(食

10、草/食肉).(2):食草动物:羚羊(3):食草动物:羚羊(4):食肉动物:老虎(5):食肉动物:老虎(6):食草动物:羚羊(7):食肉动物:老虎196.2.3 虚函数的重载虚函数的重载1.虚函数与重载的关系 一般的函数重载,只要函数名相同,函数的所带参数的个数、类型或次序不同。当重载一个虚函数时,也就是说在派生类中重新定义此虚函数时,要求函数名、返回类型、参数个数、参数类型以及参数的顺序都与基类中的原型完全相同,不能有任何的不同。【例6.7】虚函数重载。20#include#include class personprotected:char*name;public:person(char*n

11、)name=new charstrlen(n)+1;strcpy(name,n);person()delete name;virtual void printInfo()/基类中的函数 cout姓名:namen;21class worker:public personprivate:char*type;public:worker(char*na,char*t=Steel Worker):person(na)type=new charstrlen(t)+1;strcpy(type,t);worker()delete type;void printInfo()/在派生类worker中重新定义 co

12、utname,;couttypeendl;22class teacher:public personprivate:char*subject;public:teacher(char*na,char*s):person(na)subject=new charstrlen(s)+1;strcpy(subject,s);teacher()delete subject;void printInfo()/在派生类teacher中重新定义 coutname,;coutsubject教师printInfo();p=&t;p-printInfo();运行结果:张晓强,园林工人李文卓,生命科学教师246.2.3

13、 虚函数的重载虚函数的重载 2.多继承中的虚函数 【例6.8】多继承中使用虚函数例题。#include class base1/定义基类base1public:virtual void display()/函数定义为虚函数cout基类base1.endl;25class base2/定义基类base2public:void display()/函数为一般成员函数cout基类base2.endl;class derive:public base1,public base2public:void display()cout派生类derive公有继承base1和base2.display();ptr

14、1=&obj3;ptr1-display();/动态联编,ptr1类型为derive类型ptr2=&obj2;ptr2-display();ptr2=&obj3;ptr2-display();/静态联编,ptr1类型为base2类型运行结果:基类base1.派生类derive公有继承base1和base2.基类base2.基类base2.276.2.4 虚析构函数虚析构函数 在析构函数前面冠以关键字virtual进行说明,则称该析构函数为虚析构函数。虚析构函数的声明语法格式如下:virtual 类名()例如:class examplepublic:virtual example();286.3

15、 纯虚函数和抽象类纯虚函数和抽象类 6.3.1 纯虚函数纯虚函数 6.3.2 抽象类抽象类296.3.1 纯虚函数纯虚函数 一些类表示没有具体意义的抽象概念,它不能为其虚函数提供具体的定义,因此可以定义为纯虚函数。纯虚函数是一个在基类中说明的虚函数,它在该基类中只有一个函数声明,并没有具体函数功能的实现。纯虚函数的声明形式如下:virtual(参数表)=0;不能创建含有一个或多个纯虚函数的类对象,纯虚函数不可以直接调用,也不可以被继承。306.3.2 抽象类抽象类 包含一个或多个纯虚函数的类称为抽象类。由于抽象类中的纯虚函数没有具体的函数实现,因此不能定义抽象类的对象。抽象类只能作为基类被子类

16、继承,其纯虚函数的实现由派生类给出。抽象类的重要用处是提供一个接口,而不揭示任何实现的细节。抽象类不能用作参数类型、函数返回类型或强制类型转换。但是,可以声明抽象类的指针和引用。31【例614】使用抽象指针。#include class CPoint /抽象基类CPoint声明protected:long x,y;public:CPoint(int xx=0,int yy=0)x=xx;y=yy;virtual void display()=0;/纯虚函数成员;32class CRectangle:public CPoint/派生类Rectangle声明private:double width

17、,height;public:CRectangle(long x,long y,double w,double h):CPoint(x,y)width=w;height=h;void display()/虚成员函数cout矩形endl;cout位置:(x,y)endl;cout长=width,宽=heightendl;33class CTriangle:public CPoint/派生类CTriangle声明private:double a,b,c;public:CTriangle(long x,long y,double a1,double b1,double c1):CPoint(x,y)

18、a=a1;b=b1;c=c1;void display()/虚成员函数cout三角形endl;cout位置:(x,y)endl;cout三边长:a,b,cdisplay();coutdisplay();运行结果:矩形位置:(10,10)长=120,宽=60-三角形位置:(50,50)三边长:345,456,567356.4 多态366.4 多态多态 6.4.1 多态的含义多态的含义 6.4.2 多态的应用多态的应用376.4.1 多态的含义多态的含义 所谓多态性是指同一个接口被不同的对象操作产生不同的响应。面向对象的多态性从实现的角度来讲,可以分为静态多态性和动态多态性两种。静态多态性是在编译

19、的过程中确定同名操作的具体操作对象的,而动态多态性则是在程序运行过程中动态地确定操作所针对的具体对象的。所谓消息,是指对类的成员函数的调用。不同的方法是指不同的实现,也就是调用了不同的函数。386.4.1 多态的含义多态的含义 动态多态是通过虚函数来实现的,虚函数的使用本质是将派生类类型的指针赋给基类类型的指针,虚函数被调用时会自动判断调用对象的类型,从而做出相应的响应。【例616】多态应用举例。#include const double Pi=3.141593;class Shapespublic:virtual void draw()=0;/基类中的纯虚函数 virtual double

20、area()=0;/基类中的纯虚函数;39class Circle:public Shapesprivate:double radius;public:Circle(double r)radius=r;void draw()/在派生类中实现coutDraw circle.endl;coutRadius=radiusendl;double area()/在派生类中实现return Pi*radius*radius;40class Square:public Shapesprivate:double length;public:Square(double len)length=len;void d

21、raw()/在派生类中实现coutDraw square.endl;coutLength=lengthdraw();cout Circle area:area()endl;coutdraw();cout Square area:area()endl;运行结果:Draw circle.Radius=10Circle area:314.159-Draw square.Length=12Square area:144426.4.2 多态的应用多态的应用【例618】设计动物类Animal,提供纯虚函数food()显示不同动物的食物;派生类Elephant类表示大象类,具体实现成员函数food()显示E

22、lephant的食物,派生类Lion类表示狮子类,具体实现成员函数food()显示Lion的食物。定义普通函数ShowFood(),其参数类型为Animal类的指针,通过指针调用food()成员函数。43#include class Animal/定义Animal类public:virtual void food()=0;/成员函数food()为纯虚函数。;class Elephant:public Animal/定义派生类Elephant类继承类Animalpublic:void food();/包含成员函数food();class Lion:public Animal/定义派生类Lion类

23、继承类Animalpublic:void food();/包含成员函数food();44void Elephant:food()coutElephant feed on grass.endl;void Lion:food()coutLion feed on meat.food();void main()Elephant elep1;Lion lion1;Animal*Aniptr;elep1.food();lion1.food();cout-endl;Aniptr=&elep1;ShowFood(Aniptr);Aniptr=&lion1;ShowFood(Aniptr);运行结果:Elephant feed on grass.Lion feed on meat.-Elephant feed on grass.Lion feed on meat.45总结总结 介绍了静态联编和动态联编的含义;讲解了虚函数的作用和定义;讲解了虚析构函数的作用和定义;讲解了纯虚函数和抽象类的概念和应用;介绍了多态性的应用。

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C++第6章-虚函数和多态性课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|