欢迎来到天天文库
浏览记录
ID:41299250
大小:180.50 KB
页数:15页
时间:2019-08-21
《C++_Chapter12》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第12章多态性与虚函数多态性(polymorphism)是面向对象程序设计的一个重要特征。在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。1从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定
2、调用的是哪个函数,因此静态多态性又称编译时的多态性。静态多态性是通过函数的重载实现的(运算符重载实质上也是函数重载)。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtualfunction)实现的。212.1基类指针派生类的一个重要特征是:派生类的指针和基类的指针兼容。多态性就是巧妙地利用了这一简单但强大的多面特征。下面我们重写上章的四边形和三角形的实例,但这里用指针兼容这一特征。3//pointerstobaseclass#include<
3、iostream>usingnamespacestd;classCPolygon{protected:intwidth,height;public:voidset_values(inta,intb){width=a;height=b;}};classCRectangle:publicCPolygon{public:intarea(){return(width*height);}};classCTriangle:publicCPolygon{public:intarea(){return(width*hei
4、ght/2);}};intmain(){CRectanglerect;//定义CRectangle类对象rectCTriangletrgl;//定义CTriangle类对象trglCPolygon*ppoly1=▭//定义指针ppoly1,可以指向CPolygon类对象,指向子类对象rectCPolygon*ppoly2=&trgl;//定义指针ppoly2,可以指向CPolygon类对象,指向子类对象trglppoly1->set_values(4,5);ppoly2->set_values(
5、4,5);cout<6、,area()应该不仅是其派生类的成员,也应是已声明为类CPolygon的成员,但问题是,CRectangle和CTriangle执行不同版本的area()函数,因此不能在基类中直接定义,但可以定义为一种虚拟成员。512.2虚拟成员虚拟成员。某类的成员可以在它的派生类中重新定义称为虚拟成员。为了声明一类的成员为虚拟的成员,只需在前面加上关键字virtual即可。对以上的程序重写,在CPolygon类中添加一个虚拟成员area()。这样,三个类都用了相同的成员:width,height,set_values7、()andarea()。6//virtualmembers#includeusingnamespacestd;classCPolygon{protected:intwidth,height;public:voidset_values(inta,intb){width=a;height=b;}virtualintarea()//声明虚拟函数area(){return(0);}};classCRectangle:publicCPolygon{public:intarea(){return(8、width*height);}};classCTriangle:publicCPolygon{public:intarea(){return(width*height/2);}};intmain(){CPolygonpoly;//定义CPolygon类对象polyCRectanglerect;//定义CRectangle类对象rectCTriangletrgl;//定义CTriangle类对象trglCPolygon*ppol
6、,area()应该不仅是其派生类的成员,也应是已声明为类CPolygon的成员,但问题是,CRectangle和CTriangle执行不同版本的area()函数,因此不能在基类中直接定义,但可以定义为一种虚拟成员。512.2虚拟成员虚拟成员。某类的成员可以在它的派生类中重新定义称为虚拟成员。为了声明一类的成员为虚拟的成员,只需在前面加上关键字virtual即可。对以上的程序重写,在CPolygon类中添加一个虚拟成员area()。这样,三个类都用了相同的成员:width,height,set_values
7、()andarea()。6//virtualmembers#includeusingnamespacestd;classCPolygon{protected:intwidth,height;public:voidset_values(inta,intb){width=a;height=b;}virtualintarea()//声明虚拟函数area(){return(0);}};classCRectangle:publicCPolygon{public:intarea(){return(
8、width*height);}};classCTriangle:publicCPolygon{public:intarea(){return(width*height/2);}};intmain(){CPolygonpoly;//定义CPolygon类对象polyCRectanglerect;//定义CRectangle类对象rectCTriangletrgl;//定义CTriangle类对象trglCPolygon*ppol
此文档下载收益归作者所有
点击更多查看相关文章~~