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