多态性实验报告.docx
《多态性实验报告.docx》由会员分享,可在线阅读,更多相关《多态性实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
多态性实验报告
洛阳理工学院实验报告
系别
计算机与信息工程系
班级
B1105
学号
B110509
姓名
课程名称
C++面向对象程序设计
实验日期
2013.10.22
实验名称
类的多态性
成绩
实验目的:
1、了解多态性的概念。
2、掌握运算符重载的基本方法。
3、掌握虚函数的定义和使用方法。
4、掌握纯虚函数和抽象类的概念和用法。
实验条件:
装有MicrosoftVisualC++6.0软件的计算机
实验内容:
1、编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。
要求将小时范围限制在大于等于0,分钟范围限制在0~59,秒钟范围限制在0~59秒。
【提示】
时间类Time{
public:
Time(inth=0,intm=0,ints=0);
Timeoperator+(Time&);
voiddisptime(string);
private:
inthourse;
intminutes;
intseconds;
};
解:
#include
#include
usingnamespacestd;
classTime
{
public:
Time(inth=0,intm=0,ints=0);
Timeoperator+(Time&);
voiddisptime(string);
private:
inthourse;
intminutes;
intseconds;
};
Time:
:
Time(inth,intm,ints)
{
hourse=h;
minutes=m;
seconds=s;
}
TimeTime:
:
operator+(Time&t)
{
inth,m,s;
s=(t.seconds+seconds)%60;
m=(minutes+t.minutes+(t.seconds+seconds)/60)%60;
h=hourse+t.hourse+(minutes+t.minutes+(t.seconds+seconds)/60)/60;
hourse=h;
minutes=m;
seconds=s;
return*this;
}
voidTime:
:
disptime(stringstr)
{
cout<cout<"<"<}
voidInput(int&h,int&m,int&s)
{
cout<<"输入时间:
";
cin>>h;
cin>>m;
cin>>s;
while(m<0||m>59||s<0||s>59)
{
cout<<"******时间输入错误!
请重新输!
******\n";
cout<<"输入时间:
";
cin>>h;
cin>>m;
cin>>s;
}
}
intmain()
{
inth1,m1,s1,h2,m2,s2;
Input(h1,m1,s1);
Input(h2,m2,s2);
TimeA(h1,m1,s1),B(h2,m2,s2);
A=A+B;
A.disptime("\n时间相加后的结果为:
");
return0;
}
运行结果如下:
2、给出下面的抽象基类container;
classcontainer
{
protected:
doubleradius;
public:
container(doubleradius1);
virtualdoublesurface_area()=0;
virtualdoublevolume()=0;
};
要求建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。
要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。
解:
程序如下
#include
#include
usingnamespacestd;
classcontainer
{
protected:
doubleradius;
public:
container(doubleradius1);
virtualdoublesurface_area()=0;
virtualdoublevolume()=0;
};
container:
:
container(doubleradius1)
{radius=radius1;}
classCube:
publiccontainer
{public:
Cube(doubleradius1):
container(radius1){}
doublesurface_area()
{return6*radius*radius;
}
doublevolume()
{returnradius*radius*radius;
}
};
classsphere:
publiccontainer
{public:
sphere(doubleradius1):
container(radius1){}
doublesurface_area()
{return4*radius*radius*3.14159;
}
doublevolume()
{return4*radius*radius*radius*3.14159/3;
}
};
classcylinder:
publiccontainer
{public:
doubleheight;
cylinder(doubleradius1,doubleh):
container(radius1)
{height=h;}
doublesurface_area()
{return4*height*radius;
}
doublevolume()
{return3.14159*radius*radius*height;
}
};
intmain()
{Cubec1(6.0);
spheres1(5.0);
cylindery1(5.0,6.0);
container*pt;
pt=&c1;
cout<<"cube:
"<surface_area()<cout<<"volumeis"<volume()<pt=&s1;
cout<<"sphere:
"<surface_area()<cout<<"volumeis"<volume()<pt=&y1;
cout<<"cylinde:
"<surface_area()<cout<<"volumeis"<volume();
return0;
}
运行结果如下:
3、分析并调试下列程序,写出程序的输出结果,并解释输出结果。
//test5_1.cpp
#include
usingnamespacestd;
classB{
public:
virtualvoidf1(doublex)
{cout<<”B:
:
f1(double)”<}
voidf2(doublex)
{cout<<”B:
:
f2(double)”<<2*x<}
voidf3(doublex)
{cout<<”B:
:
f3(double)”<<3*x<}
}
classD:
publicB{
public:
virtualvoidf1(doublex)
{cout<<”D:
:
f1(double)”<}
voidf2(doublex)
{cout<<”D:
:
f2(double)”<<2*x<}
voidf3(doublex)
{cout<<”D:
:
f3(double)”<<3*x<}
};
intmain()
{Dd;
B*pb=&d;
D*pd=&d;
pb->f1(1.23);
pb->f1(1.23);
pb->f2(1.23);
pb->f3(1.23);
pb->f3(3.14);
return0;
}
正确程序:
//test5_1.cpp
#include
usingnamespacestd;
classB{
public:
virtualvoidf1(doublex)
{cout<<"B:
:
f1(double)"<}
voidf2(doublex)
{cout<<"B:
:
f2(double)"<<2*x<}
voidf3(doublex)
{cout<<"B:
:
f3(double)"<<3*x<}
};
classD:
publicB
{
public:
virtualvoidf1(doublex)
{cout<<"D:
:
f1(double)"<}
voidf2(doublex)
{cout<<"D:
:
f2(double)"<<2*x<}
voidf3(doublex)
{cout<<"D:
:
f3(double)"<<3*x<}
};
intmain()
{Dd;
B*pb=&d;
D*pd=&d;
pb->f1(1.23);
pb->f1(1.23);
pb->f2(1.23);
pb->f3(1.23);
pb->f3(3.14);
return0;
}
程序的输出结果
解释输出结果:
Pb为指向基类的指针变量,在派生类D的基类部分中,派生类的虚函数f1取代了基类原来的虚函数,因此在使基类指针pb指向基类的虚函数f1时,即指向了派生类的虚函数f1,而由于f2,f3均不为虚函数,所以基类指针还是指向基类的f2,f3.
4、编写一个程序,用于进行集合的并、差和交运算。
例如输入整数集合{954367}和{2469},计算出它们进行集合的并、差和交运算后的结果。
【提示】
i.可用以下表达式实现整数集合的基本运算:
s1+s2两个整数集合的并运算
s1-s2两个整数集合的差运算
s1*s2两个整数集合的交运算
ii.参考以下Set类的框架,用于完成集合基本运算所需的各项功能。
classset{
public:
set:
:
set();
voidset:
:
input(intd);
intset:
:
length();
intset:
:
getd(inti);
voidset:
:
disp();
setset:
:
operator+(sets1);
setset:
:
operator-(sets1);
setset:
:
operator*(sets1);
setset:
:
operator=(sets1);
protected:
intlen;
ints[MAX];
};
解:
程序如下:
#include
usingnamespacestd;
constintMAX=50;
classset
{
public:
set();
voidinput();
intlength();
//intgetd();
voiddisp();
setoperator+(sets1);
setset:
:
operator-(sets1);
setset:
:
operator*(sets1);
/*setoperator=(sets1);*/
protected:
intlen;
ints[MAX];
};
set:
:
set()
{
len=0;
for(inti=0;is[i]=0;
/*cout<<"***建立一个集合***\n";*/
}
voidset:
:
input()
{
cout<<"请输入集合的长度"<cin>>len;
cout<<"请输入集合元素"<for(inti=0;icin>>s[i];
}
intset:
:
length()
{
returnlen;
}
/*intset:
:
getd()
{
returnlen;
}*/
voidset:
:
disp()
{
if(0==len)
cout<<"空集"<else
{
for(inti=0;icout<
cout<}
}
setset:
:
operator*(sets1)
{
setm;
inti,j;
for(i=0;ifor(j=0;j{
if(s[i]==s1.s[j])
m.s[m.len++]=s[i];
else
continue;
}
returnm;
}
setset:
:
operator+(sets1)
{
inti,j,m;
for(i=0;i{
m=0;
for(j=0;jif(s[i]==s1.s[j])
m=1;
else
continue;
if(0==m)
s1.s[s1.len++]=s[i];
}
returns1;
}
setset:
:
operator-(sets1)
{
setm;
inti,j,k;
for(i=0;i{
k=0;
for(j=0;j{if(s[i]==s1.s[j])
k=1;
else
continue;
}
if(0==k)
m.s[m.len++]=s[i];
}
returnm;
}
/*setset:
:
operator=(sets1)
{
setm;
for(inti=0;im.s[i]=s1.s[i];
m.len=s1.len;
returnm;
}*/
intmain()
{
sets1;
s1.input();
sets2;
s2.input();
cout<<"两集合的并集(A+B)为:
";
sets;
s=s1+s2;
s.disp();
cout<<"两集合的差集A-B为:
";
s=s1-s2;
s.disp();
cout<<"两集合的交集A*B为:
";
s=s1*s2;
s.disp();
cout<<""<cout<<"2013"<return0;
}
输出结果如下:
实验总结:
学习使用虚函数实现动态多态性。
而虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数,且在派生类中重工业新定义时,其函数原型,包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的完全相同。
此外,构造函数不能是虚函数,但析构函数可以是虚函数。