C++_Chapter12.ppt

上传人:gsy****95 文档编号:88512303 上传时间:2023-04-26 格式:PPT 页数:15 大小:180.50KB
返回 下载 相关 举报
C++_Chapter12.ppt_第1页
第1页 / 共15页
C++_Chapter12.ppt_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《C++_Chapter12.ppt》由会员分享,可在线阅读,更多相关《C++_Chapter12.ppt(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第12章 多态性与虚函数n多态性(polymorphism)是面向对象程序设计的一个重要特征。n在C+程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。1n从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。静态多态性是通过函数的重载实现的

2、(运算符重载实质上也是函数重载)。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。212.1 基类指针n派生类的一个重要特征是:派生类的指针和基类的指针兼容。n多态性就是巧妙地利用了这一简单但强大的多面特征。n下面我们重写上章的四边形和三角形的实例,但这里用指针兼容这一特征。3/pointers to base class#include using namespace std;class CPolygon protected:int width,height;public:void set_va

3、lues(int a,int b)width=a;height=b;class CRectangle:public CPolygon public:int area()return(width*height);class CTriangle:public CPolygon public:int area()return(width*height/2);int main()CRectangle rect;/定义CRectangle类对象rect CTriangle trgl;/定义CTriangle类对象trgl CPolygon*ppoly1=▭/定义指针ppoly1,可以指向CPo

4、lygon类对象,指向子类对象rect CPolygon*ppoly2=&trgl;/定义指针ppoly2,可以指向CPolygon类对象,指向子类对象trgl ppoly1-set_values(4,5);ppoly2-set_values(4,5);cout rect.area()endl;cout trgl.area()endl;return 0;4n使用指针 ppoly1 和 ppoly2唯一的限制是,ppoly1和ppoly2是指向CPolygon类型,因此我们只能用这些指针指向继承自CPolygon类的CRectangle类和CTriangle类的成员。出于这个原因,当我们调用ar

5、ea()成员时,我们不得不直接使用对象rect and trgl而不能使用指针ppoly1和ppoly2。n为了类CPolygon的指针使用area()成员,area()应该不仅是其派生类的成员,也应是已声明为类CPolygon的成员,但问题是,CRectangle和CTriangle执行不同版本的area()函数,因此不能在基类中直接定义,但可以定义为一种虚拟成员。512.2 虚拟成员虚拟成员n虚拟成员。某类的成员可以在它的派生类中重新定义称为虚拟成员。为了声明一类的成员为虚拟的成员,只需在前面加上关键字virtual即可。n对以上的程序重写,在CPolygon类中添加一个虚拟成员 area

6、()。n这样,三个类都用了相同的成员:width,height,set_values()and area()。6/virtual members#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area()/声明虚拟函数area()return(0);class CRectangle:public CPolygon public:int area()return(width*h

7、eight);class CTriangle:public CPolygon public:int area()return(width*height/2);int main()CPolygon poly;/定义CPolygon类对象poly CRectangle rect;/定义CRectangle类对象rect CTriangle trgl;/定义CTriangle类对象trgl CPolygon*ppoly1=▭/定义指针ppoly1,可以指向CPolygon类对象,指向子类对象rect CPolygon*ppoly2=&trgl;/定义指针ppoly2,可以指向CPolygo

8、n类对象,指向子类对象trgl CPolygon*ppoly3=&poly;/定义指针ppoly3,可以指向CPolygon类对象,指向基类对象poly ppoly1-set_values(4,5);ppoly2-set_values(4,5);ppoly3-set_values(4,5);cout area()endl;cout area()endl;cout area()endl;return 0;7n如果我们试图不用关键字virtual,那么会发现运行结果是三个0,而不是:20,10,0。n因为不用关键字virtual,三个指针的类型都是CPolygon*,都调用CPolygon:are

9、a(),而不是分别调用每个对象的相应area()函数(CRectangle:area(),CTriangle:area()and CPolygon:area())。n基类的指针指向子类对象,并且基类的成员和子类的成员同名,关键字virtual的作用就是让指针调用来自子类的对象成员时,具体地调用子类成员,而不是基类的成员。n一个类如果是含有虚拟成员函数的类,或继承自含有虚拟成员函数的类,称为多态类。n以上的含有虚拟成员函数的基类,可以定义对象(CPolygon poly;),也可以 调用来自他自己的成员函数(area(),值是0)。812.3 抽象基类n抽象基类和前面我们定义的基类非常类似,只是

10、我们前面的基类的虚拟成员有效的函数,对定义自基类的对象(如对象poly 有一个基本的最小功能。而抽象基类定义的虚拟成员函数根本就不能执行,直接在函数后面写上等于0。class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area()=0;9n注意,函数是直接让函数名等于0,而不定义任何执行语句,这样的函数称为纯虚拟函数,含有纯虚拟函数的基类我们称为抽象基类。n抽象基类和一般多态基类的区别是,因为抽象基类至少含有一个非执行性虚拟函数,抽象基类

11、不能定义对象。n不能定义对象的抽象基类并不是完全无用的,我们可以定义指向抽象类的指针变量指向来自其子类的对象。10n上例中,对于抽象类,“CPolygon poly;”是错误的,但“CPolygon*ppoly1;CPolygon*ppoly2;”是正确的,ppoly1和ppoly2可以指向来自CPolygon子类的对象。n下面是完整的实例:11/abstract base class#include using namespace std;class CPolygon /抽象基类 protected:int width,height;public:void set_values(int a,

12、int b)width=a;height=b;virtual int area(void)=0;/纯虚拟函数 ;class CRectangle:public CPolygon public:int area(void)return(width*height);class CTriangle:public CPolygon public:int area(void)return(width*height/2);int main()CRectangle rect;/定义子类的对象 CTriangle trgl;/定义子类的对象 CPolygon*ppoly1=▭/定义指向基类的指针,指

13、向子类的对象 CPolygon*ppoly2=&trgl;/定义指向基类的指针,指向子类的对象 ppoly1-set_values(4,5);ppoly2-set_values(4,5);cout area()endl;cout area()endl;return 0;12n现在我们在基类CPolygon中定义一个用于将area()函数结果输出到显示器上的成员函数,尽管基类CPolygon的函数本身不会有任何执行。该例用到this指针。nthis指针。关键字this代表一个指针,该指针指向的对象的成员函数正在被调用。也就说this是隐含与每一个类的非静态成员函数中的特殊指针(包括构造函数和析构

14、函数),它用于指向正在被成员函数操作的对象。他是指向当前对象的指针。n对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。13/pure virtual members can be called/from the abstract base class#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int are

15、a(void)=0;void printarea(void)cout area()set_values(4,5);ppoly2-set_values(4,5);ppoly1-printarea();ppoly2-printarea();return 0;14/dynamic allocation and polymorphism下例是上面同样的例子,但对象是采用的动态创建:#include using namespace std;class CPolygon protected:int width,height;public:void set_values(int a,int b)width=a;height=b;virtual int area(void)=0;void printarea(void)cout area()set_values(4,5);ppoly2-set_values(4,5);ppoly1-printarea();ppoly2-printarea();delete ppoly1;delete ppoly2;return 0;15

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁