实验三 虚函数与多态 纯虚函数完整版.docx
- 文档编号:9115866
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:11
- 大小:99.87KB
实验三 虚函数与多态 纯虚函数完整版.docx
《实验三 虚函数与多态 纯虚函数完整版.docx》由会员分享,可在线阅读,更多相关《实验三 虚函数与多态 纯虚函数完整版.docx(11页珍藏版)》请在冰豆网上搜索。
实验三虚函数与多态纯虚函数完整版
实验三虚函数与多态、纯虚函数
一.实验目的
1.在掌握继承与派生关系的基础上,进一步理解虚函数与多态性的关系,实现运行时的多态。
2.学会定义和使用纯虚函数
二、实验容
1.例:
了解"单接口,多方法"的概念。
现有称为figure的基类,存放了各二维对象(三角形、矩形和圆形三个类)的各维数据,set_dim()设置数据,是标准成员函数。
show_area()为虚函数,因为计算各对象的面积的方法是不同的。
【程序】
#include
usingnamespacestd;
classfigure{
protected:
doublex,y;
public:
voidset_dim(doublei,doublej=0)
{x=i;y=j;}
virtualvoidshow_area()
{cout<<"Noareacomputationdefinedforthisclass.\n";
}
};
classtriangle:
publicfigure{
public:
voidshow_area()
{cout<<"Trianglewithheight"< } }; classsquare: publicfigure{ public: voidshow_area() {cout<<"Squarewithdimensions"< } }; classcircle: publicfigure{ public: voidshow_area() {cout<<"Circlewithradius"< } }; intmain(){ figure*p; trianglet; squares; circlec; p=&t; p->set_dim(10.0,5.0); p->show_area(); p=&s; p->set_dim(10.0,5.0); p->show_area(); p=&c;p->set_dim(10.0); p->show_area(); return0; } 【要求】 (1)建立工程,录入上述程序,调试运行并记录运行结果。 (2)修改上述程序,将virtualvoidshow_area()中的virtual去掉,重新调试运行观察结果有何变化? 为什么? 在不使用关键字virtual后,基类指针p对show-area的访问p->show_area()没有针对所指对象的类型调用不同的函数,而是直接根据p的类型调用了基类的成员函数show-area。 (3)修改上述程序入口函数,使其动态建立三角形、矩形和圆形3个对象,通过基类指针访问这3个对象,然后释放这3个对象。 #include usingnamespacestd; classfigure{ protected: doublex,y; public: voidset_dim(doublei,doublej=0) {x=i;y=j;} virtualvoidshow_area() {cout<<"Noareacomputationdefinedforthisclass.\n"; } }; classtriangle: publicfigure{ public: voidshow_area() {cout<<"Trianglewithheight"< } }; classsquare: publicfigure{ public: voidshow_area() {cout<<"Squarewithdimensions"< } }; classcircle: publicfigure{ public: voidshow_area() {cout<<"Circlewithradius"< } }; intmain() { figure*p; triangle*p1; square*p2; circle*p3; p1=newtriangle; p2=newsquare; p3=newcircle; p=p1; p->set_dim(10.0,5.0); p->show_area(); p=p2; p->set_dim(10.0,5.0); p->show_area(); p=p3; p->set_dim(10.0); p->show_area(); deletep1; deletep2; deletep3; } (4)修改类定义中的析构函数,使之适应用户动态定义对2、使用纯虚函数和抽象类对实验二中的题1进行改进。 #include usingnamespacestd; classfigure{ protected: doublex,y; public: voidset_dim(doublei,doublej=0) {x=i;y=j;} virtualvoidshow_area() { cout<<"Noareacomputationdefinedforthisclass.\n"; } /////////////////////////////////// ///////在此处将基类的析构函数声明为虚析构就OK了 virtual~figure(){} //////////////////////////////////// }; classtriangle: publicfigure{ public: voidshow_area() { cout<<"Trianglewithheight"< } }; classsquare: publicfigure{ public: voidshow_area() { cout<<"Squarewithdimensions"< } }; classcircle: publicfigure{ public: voidshow_area() { cout<<"Circlewithradius"< } }; intmain(){ figure*p; trianglet; squares; circlec; p=&t; p->set_dim(10.0,5.0); p->show_area(); p=&s; p->set_dim(10.0,5.0); p->show_area(); p=&c;p->set_dim(10.0); p->show_area(); return0; } 2、编程: 自定义一个抽象类Element,提供显示、求面积等公共接口(虚函数),派生出Point、Line、Circle等图形元素类,并重新定义(override)这些虚函数,完成各自的任务。 在这里,Element是抽象基类,它不能提供具体的显示操作,应将其成员函数定义为纯虚函数。 只有采用指向基类的指针或对基类的引用进行调用,实现的才是动态绑定, 完成运行时的多态性。 #include usingnamespacestd; constdoublePI=3.14159; classElement{ public: virtualconstchar*Name()const=0; virtualdoubleArea()const=0; }; classPoint: publicElement{ protected: doublex,y; public: Point(doublexv=0,doubleyv=0): x(xv),y(yv) {} virtualconstchar*Name()const{return"Point";} virtualdoubleArea()const{return0;} }; classLine: publicElement{ protected: doublelength; public: Line(doublel=0): length(l){} virtualconstchar*Name()const{return"Line";} virtualdoubleArea()const{return0;} }; classCircle: publicElement{ protected: doubleradius; public: Circle(doubler): radius(r){} virtualconstchar*Name()const{return"Circle";} virtualdoubleArea()const{returnPI*radius*radius;} }; voidprint(Element*p){ cout< \t"< } intmain() { PointA(1,1); print(&A); LineB(10); print(&B); CircleC(10); print(&C); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 虚函数与多态 纯虚函数完整版 实验 函数 完整版