第5章 多态性与虚函数ppt课件.ppt

第5章 多态性与虚函数ppt课件.ppt

ID:59208388

大小:445.50 KB

页数:41页

时间:2020-09-26

第5章 多态性与虚函数ppt课件.ppt_第1页
第5章 多态性与虚函数ppt课件.ppt_第2页
第5章 多态性与虚函数ppt课件.ppt_第3页
第5章 多态性与虚函数ppt课件.ppt_第4页
第5章 多态性与虚函数ppt课件.ppt_第5页
资源描述:

《第5章 多态性与虚函数ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第5章多态性与虚函数5.1多态性概述5.2基类与派生类对象之间的赋值兼容关系5.3虚函数5.4纯虚函数和抽象类1面向对象系统的多态性是指不同的对象收到相同的的消息时会产生不同的行为(即方法)。1.在日常生活中:汽车行为1挪开同一消息凳子行为22.在OOP中:三角形对象行为3求面积同一消息长方形对象行为4在C++程序设计中,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,这样就可以用同一个函数名调用不同内容的函数。5.1多态性概述2在C++中,多态的实现和联编这一概念有关。所谓联编是指一个计算机程序的不同部分彼此关联的过程。如,把函数名与函数体的程序代码连

2、接(联系)在一起的过程。静态联编(早期联编、静态束定)联编动态联编(晚期联编、动态束定)静态联编就是在编译阶段完成的联编。静态联编函数调用速度很快。效率高,但缺乏灵活性;动态联编是运行阶段完成的联编。动态联编在运行时才能确定调用哪个函数,它降低了程序的运行效率,但增强了程序的灵活性。C++实际上是采用了静态联编和动态联编相结合的联编方法。3编译时的多态性(函数重载、运算符重载)多态性运行时的多态性(虚函数)编译时的多态是通过静态联编来实现的。运行时的多态是通过动态联编实现的。本章着重讲解运行时多态性。45.2基类与派生类对象之间的赋值兼容关系在一定条件下,不同类型的数据之间

3、可以进行类型转换,例如inti=10; doublex=i;不同类型数据之间的自动转换和赋值,称为赋值兼容。在基类和派生类对象之间也存有赋值兼容关系。把一个整型数(int)转换为双精度型数(double),然后再把它赋给双精度型变量。5具体表现在以下几个方面:(1)可以用派生类对象给基类对象赋值。例如:例5-1Baseb;//定义基类Base的对象bDerivedd;//定义公有派生类Derived的对象db=d;这样赋值的效果是,对象b中数据成员将具有对象d中对应数据成员的值。用派生类对象d对基类对象b赋值6说明:所谓赋值仅仅指对基类的数据成员赋值。7(2)可以用派生类对

4、象来初始化基类对象的引用。例如5-2:Baseb;//定义基类Base的对象bDerivedd;//定义基类Base的公有派生类//Derived的对象dBase&br=d;定义基类Base的对象的引用br,并用派生类Derived的对象d对其初始化8(3)派生类对象的地址可以赋给指向基类对象的指针。例如,例5-3:Derivedd;//定义基类Base的公有派生类//Derived的对象dBase*bp=&d;把派生类对象的地址&d赋值给指向基类的指针bp,也就是说,使指向基类对象的指针bp指向派生类对象d。9(4)声明为指向基类对象的指针可以指向它的公有派生的对象,但不

5、允许指向它的私有派生的对象。例如:classBase{…};classDerive:privateBase{…};intmain(){Baseop1,*ptr;Deriveop2;ptr=&op1;ptr=&op2;…}定义基类Base的对象op1及指向基类Base的指针ptr定义派生类Derive的对象op2错误,不允许将指向基类Base的指针ptr指向它的私有派生类对象op2将指针ptr指向基类对象op110(5)允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类对象的指针指向其基类的对象。例如:classBase{…};classDe

6、rived:publicBase{…};intmain(){Baseobj1;Derivedobj2,*ptr;ptr=&obj2;ptr=&obj1;…}定义基类对象obj1将指向派生类对象的指针ptr指向派生类对象obj2定义派生类对象obj2及指向派生类的指针ptr错误,试图将指向派生类对象的指针ptr指向其基类对象obj111(6)在C++中规定:基类的对象指针可以指向它的公有派生的对象,但是当其指向公有派生类对象时,它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员,例如:classA{public:voidprint1(){...}};cla

7、ssB:publicA{public:voidprint2(){...}};voidmain(){A*p1;//定义基类A的指针变量p1Bop2;//定义派生类B的对象op2p1=&op2;//将指针变量p1指向派生类对象op2p1->print1();p1->print2();}正确,基类指针变量p1可以访问派生类中从基类继承来的成员函数print1()错误,基类指针变量p1不能访问派生类中定义的成员函数print2()12//例5-5静态联编#includeclassA{public:v

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。