实验三虚函数与多态纯虚函数完整版.docx

上传人:b****5 文档编号:7716973 上传时间:2023-01-26 格式:DOCX 页数:15 大小:16.25KB
下载 相关 举报
实验三虚函数与多态纯虚函数完整版.docx_第1页
第1页 / 共15页
实验三虚函数与多态纯虚函数完整版.docx_第2页
第2页 / 共15页
实验三虚函数与多态纯虚函数完整版.docx_第3页
第3页 / 共15页
实验三虚函数与多态纯虚函数完整版.docx_第4页
第4页 / 共15页
实验三虚函数与多态纯虚函数完整版.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验三虚函数与多态纯虚函数完整版.docx

《实验三虚函数与多态纯虚函数完整版.docx》由会员分享,可在线阅读,更多相关《实验三虚函数与多态纯虚函数完整版.docx(15页珍藏版)》请在冰豆网上搜索。

实验三虚函数与多态纯虚函数完整版.docx

实验三虚函数与多态纯虚函数完整版

 

实验三虚函数与多态、纯虚函数

 

一.实验目的

 

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)修改类定义中的析构函数,使之适应用户动态定义对和抽象类对实验二中的题1进行改进。

 

2、使用纯虚函数

#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<Name()<<":

\t"<Area()<

 

}

 

intmain()

 

{

 

PointA(1,1);

 

print(&A);

 

LineB(10);

 

print(&B);

 

CircleC(10);

 

print(&C);

 

return0;

 

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1