面向对象程序设计多态性精选PPT.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《面向对象程序设计多态性精选PPT.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计多态性精选PPT.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象程序设计多态性第1页,此课件共64页哦n但是,在面向对象程序设计领域,所谓多态性通常特指下述机制:派生类对象可以像基类对象一样使用,同样的消息既可以发送给基类对象也可以发送给派生类对象。第2页,此课件共64页哦n也就是说,在类等级的不同层次中可以共享一个行为的名字,但是不同层次中的类却各自按自己的需要来实现这个行为。n简而言之:在不同的类层次中,同一个消息被不同的对象接收,产生了不同的行为。当一个对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。第3页,此课件共64页哦n多态性机制不仅增加了面向对象软件系统的灵活性,进一步减少了冗余信息,而且显著提高了软件
2、的可重用性和可扩充性。n本章主要讲述,静态联编与动态联编,虚函数的声明与使用,虚函数应用实例,纯虚函数,多态性带来的好处等内容。第4页,此课件共64页哦本章快速索引面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版9.1 9.1 静态联编与动态联编静态联编与动态联编 9.2 9.2 虚函数的声明与使用虚函数的声明与使用9.3 9.3 虚函数应用实例之一虚函数应用实例之一 9.4 9.4 纯虚函数纯虚函数9.5 9.5 虚函数应用实例之二虚函数应用实例之二 9.6 9.6 多态性带来的好处多态性带来的好处 9.7 9.7 小结小结第5页,此课件共64页哦9
3、.1 静态联编与动态联编 n所谓联编(tinding),就是使一个计算机程序的不同部分彼此关联的过程。n静态联编在编译阶段完成,因为所有联编过程都在程序开始运行之前完成,因此静态联编也叫先前联编或早期联编。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第6页,此课件共64页哦n编译程序在编译时并不确切知道应把发送到对象的消息和实现消息的哪段具体代码联编在一起,而是在运行时才能把函数调用与函数体联系在一起,则称为动态联编。第7页,此课件共64页哦9.1.1静态联编对重载函数的调用是在编译阶段完成联编的,有下述3种区分重载函数的方法:根据实参特征来区分。
4、使用作用域分辨符加以区分。根据对象的类型来区分。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第8页,此课件共64页哦下面让我们看一个简单程序例子:#include stdafx.h#include iostream.hclass Basepublic:void Who()cout I am base classn;第9页,此课件共64页哦class FirstDerived:public Basepublic:void Who()cout I am first derived classn;第10页,此课件共64页哦class SecondDeri
5、ved:public Basepublic:void Who()cout Who();p=&first_obj;p-Who();p=&second_obj;p-Who();first_obj.Who();second_obj.Who();运行输出结果:I am base classI am base classI am base classI am first derived classI am second derived class第12页,此课件共64页哦9.1.2动态联编 n如果随着指针P实际指向的对象不同,使用语句P-Who();能够调用不同类中Who的相同版本,我们就可以用相同的界
6、面P-Who()访问函数Who的多个实现版本,从而也就能够在程序运行时告诉用户,当时指针P实际指向何类对象。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第13页,此课件共64页哦n函数调用P-Who()依赖于程序运行时P的值。虚函数提供的就是这样一种机制。把由指针调用的成员函数声明为虚函数,则声明为指向基类对象的指针,可以根据它在程序运行过程中当时实际指向的对象类型,通过动态联编调用相应类中的虚函数。第14页,此课件共64页哦n#include nclass studentnnpublic:nvoid calct()nncoutstudent xu
7、efeiendl;nn;nclass grastu:public studentnnpublic:nvoid calct()nncoutgrastu xuefeiendl;nn;第15页,此课件共64页哦nvoid fn(student&x)nnx.calct();nnvoid main()nnstudent s;ngrastu gs;nfn(s);nfn(gs);n第16页,此课件共64页哦为了把成员函数Who声明为虚函数,我们把上述程序修改为:#include stdafx.h#include iostream.hclass Basepublic:virtual void Who()/定义
8、Who()为虚函数 cout I am base classn;面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第17页,此课件共64页哦class FirstDerived:public Basepublic:void Who()cout I am first derived classn;第18页,此课件共64页哦class SecondDerived:public Basepublic:void Who()cout Who();p=&first_obj;p-Who();p=&second_obj;p-Who();第20页,此课件共64页哦n运行结
9、果如下:nI am base classnI am first derived classnI am second derived class第21页,此课件共64页哦9.2 虚函数的声明与使用 9.2.1声明虚函数声明虚函数的一般格式如下:virtual 函数原型;必须首先在基类中声明虚函数。派生类中与基类虚函数原型完全相同的成员函数,即使在说明时前面没有冠以关键字virtual也自动成为虚函数。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第22页,此课件共64页哦9.2.1声明虚函数 只有非静态成员函数可以声明为虚函数。不允许在派生类中定义与基
10、类虚函数名字及参数特征都相同,仅仅返回类型不同的成员函数。编译时出错。系统把函数名相同但参数特征不同的函数视为不同的函数。通过声明虚函数来使用C+提供的多态性机制时,派生类应该从它的基类公有派生。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第23页,此课件共64页哦n#include nclass studentnnpublic:n virtual void calct(int x)nncoutstudent xuefei xendl;nn;nclass grastu:public studentnnpublic:nvirtual void cal
11、ct(float x)nncoutgrastu xuefei xendl;nnn;第24页,此课件共64页哦nvoid fn(student&x)nnint i=1;nfloat j=9.8;nx.calct(i);nx.calct(j);nnvoid main()nnstudent s;ngrastu gs;nfn(s);nfn(gs);n第25页,此课件共64页哦9.2.2使用虚函数n仅当程序中用指向基类对象的指针变量或引用基类对象的引用变量调用虚函数时,系统才以动态联编方式实现对虚函数的调用,例如:面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版
12、第26页,此课件共64页哦#include“stdafx.h”#include“iostream.h”class Apublic:/void show()virtual void show()/必须要有virtual关键字,才能实现多态性cout AAA.endl;第27页,此课件共64页哦class B:public Apublic:void show()/派生类中原型相同的函数可以不加关键字,/也被默认为虚函数cout BBB.endl;面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第28页,此课件共64页哦class C:public Bpub
13、lic:void show()/派生类中原型相同的函数可以不加关键字,/也被默认为虚函数cout CCC.show();a_p=b_p;/通过赋值形式,将派生类对象b的指针传递给基类对象指针a_p-show();/调用的接口形式不变,仍为“a_p-show()”,但调用的是b中的show()a_p=c_p;/通过赋值形式,将派生类对象c的指针传递给基类对象指针a_p-show();/调用的接口形式不变,仍为“a_p-show()”,但调用的是c中的show()面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第32页,此课件共64页哦n运行结果:nAAA
14、 nBBB nCCCnAAA nBBB nCCC第33页,此课件共64页哦关于程序的几点说明:准备实现多态性的方法前面必须加关键字virtual,这被称为虚函数,是实现多态性的必要条件。使用多态性时,它的调用接口形式是不变的,关键是看基类对象的指针指向了哪个对象,就调用了哪个对象的方法。而这种指向有两种表现形式:一种是通过实参、形参结合的形式;另一种是通过赋值语句的形式。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第34页,此课件共64页哦为了实现动态联编,函数中参数类型必须是引用或者指针类型(如display(A*a);或display(A&a)
15、;)。通常用指向第一次定义虚函数的基类对象的指针来调用虚函数,可以获得运行时的多态性。(如例中使用“a_p-show();”调用,而没有使用其他派生类对象指针)第35页,此课件共64页哦使用普通对象调用虚函数时,系统仍然以静态联编方式完成对虚函数的调用(如例中display(A a);),请读者上机实践。基类与派生类是相对的,因此,并非在任何情况下都必须首先在类等级的最高层类内声明虚函数。第36页,此课件共64页哦9.2.3 动态联编的实现nC+语言中的动态联编是通过使用虚函数表(Virtual Function Table)来实现的,虚函数表也称为v-表。n每个类的实例都有一个隐含的指向该类
16、v-表的指针,当执行诸如a_p-show()这样的语句时,系统首先取a_p所实际指向的对象中的v-表指针,然后调用由这个v-表中指针项所指定的函数show(),从而实现了对不同类的虚函数的调用。面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计 第二版第二版第二版第二版第37页,此课件共64页哦9.3 虚函数应用实例之一 下面是实现上述要求的程序:#include stdafx.h#include iostream.hclass Figureprotected:float x,y;public:void Set(float i,float j=0)x=i;y=j;virtual
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 多态性 精选 PPT
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内