实验三虚函数与多态纯虚函数完整版.docx
《实验三虚函数与多态纯虚函数完整版.docx》由会员分享,可在线阅读,更多相关《实验三虚函数与多态纯虚函数完整版.docx(9页珍藏版)》请在冰豆网上搜索。
实验三虚函数与多态纯虚函数完整版
实验三虚函数与多态、纯虚函数
一.实验目的
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;
}