欢迎来到天天文库
浏览记录
ID:50350243
大小:214.50 KB
页数:30页
时间:2020-03-08
《C++面向对象程序设计 李素若 杜华兵主著 c5.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第5章多态性和虚函数主要内容5.1多态性概述5.2子类型5.3虚函数5.4纯虚函数和抽象类5.1多态性概述所谓多态性就是不同对象收到相同的消息时,产生不同的动作。直观地说,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。5.1.1多态的分类C++中的多态性可以分为四类:参数多态(函数模板、类模板)包含多态(虚函数)重载多态(函数重载、运算符重载)强制多态(强制类型转换)。前面两种统称为通用多态,而后面两种统称为专用多态。5.1.2多态的实现多态性的实现和联编这一概念有关。所谓联编就是把函数名与函数体的程序
2、代码连接(联系)在一起的过程。联编分成两大类:静态联编和动态联编。静态联编优点:调用速度快,效率高,但缺乏灵活性;动态联编优点:运行效率低,但增强了程序灵活性。C++为了兼容C语言仍然是编译型的,采用静态联编。为了实现多态性,利用虚函数机制,可部分地采用动态联编。5.1.2多态的实现多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。编译时的多态是通过静态联编来实现的。静态联编就是在编译阶段完成的联编。编译时多态性主要是通过函数重载和运算符重载实现的。运行时的多态是用动态联编实现的。动态联编是运行阶段完成的联编。运行时多态性主要是通过虚函数来实现的。虚函数提供了一种更为灵
3、活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的动态联编。5.2虚函数例:没有引入虚函数的实例1。#includeclassA{public:voidshow(){cout<<"A";}};classB:publicA{public:voidshow(){cout<<"B";}};main(){Aa,*pc;Bb;pc=&a;pc->show();pc=&b;pc->show();return0;}5.2.1为什么引入虚函数例5.1没有引入虚函数的实例2#includeclass
4、Base{public:Base(intx,inty){a=x;b=y;}voidshow(){cout<<"Base---------------";cout<5、,*pc;Derivedmc(10,20,30);pc=&mb;pc->show();pc=&mc;pc->show();}5.2.1为什么引入虚函数1.虚函数的定义定义虚函数的方法如下:virtual函数类型函数名(形参表){//函数体}5.2.2虚函数的定义和使用说明:(1)派生类应该从它的基类公有派生。(2)必须首先在基类中定义虚函数。(3)派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。(4)一般通过基类指针访问虚函数时才能体现多态性。(5)一个虚函数无论被继承多少次,保持其虚函数特性。(6)虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数6、。(7)内联函数不能是虚函数。(8)构造函数不能是虚函数。(9)析构函数可以使虚函数,通常说明为虚函数。5.2.2虚函数的定义和使用2.虚函数的使用#includeclassbase{private:intx,y;public:base(intxx=0,intyy=0){x=xx;y=yy;}virtualvoiddisp(){cout<<"base:"<7、voiddisp(){cout<<"base1:"<disp();objp=&obj1;//基类指针指向派生类对象objp->disp();//动态调用,调用派生类disp()函数obj=obj1;//派生类对象赋给基类对象obj.di
5、,*pc;Derivedmc(10,20,30);pc=&mb;pc->show();pc=&mc;pc->show();}5.2.1为什么引入虚函数1.虚函数的定义定义虚函数的方法如下:virtual函数类型函数名(形参表){//函数体}5.2.2虚函数的定义和使用说明:(1)派生类应该从它的基类公有派生。(2)必须首先在基类中定义虚函数。(3)派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。(4)一般通过基类指针访问虚函数时才能体现多态性。(5)一个虚函数无论被继承多少次,保持其虚函数特性。(6)虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数
6、。(7)内联函数不能是虚函数。(8)构造函数不能是虚函数。(9)析构函数可以使虚函数,通常说明为虚函数。5.2.2虚函数的定义和使用2.虚函数的使用#includeclassbase{private:intx,y;public:base(intxx=0,intyy=0){x=xx;y=yy;}virtualvoiddisp(){cout<<"base:"<7、voiddisp(){cout<<"base1:"<disp();objp=&obj1;//基类指针指向派生类对象objp->disp();//动态调用,调用派生类disp()函数obj=obj1;//派生类对象赋给基类对象obj.di
7、voiddisp(){cout<<"base1:"<disp();objp=&obj1;//基类指针指向派生类对象objp->disp();//动态调用,调用派生类disp()函数obj=obj1;//派生类对象赋给基类对象obj.di
此文档下载收益归作者所有