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

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

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

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

实验三虚函数与多态纯虚函数完整版.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)修改类定义中的析构函数,使之适应用户动态定义对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<Name()<<":

\t"<Area()<

}

intmain()

{

PointA(1,1);

print(&A);

LineB(10);

print(&B);

CircleC(10);

print(&C);

return0;

}

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

当前位置:首页 > 自然科学 > 化学

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

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