多态性实验报告.docx

上传人:b****8 文档编号:9446291 上传时间:2023-02-04 格式:DOCX 页数:18 大小:82.92KB
下载 相关 举报
多态性实验报告.docx_第1页
第1页 / 共18页
多态性实验报告.docx_第2页
第2页 / 共18页
多态性实验报告.docx_第3页
第3页 / 共18页
多态性实验报告.docx_第4页
第4页 / 共18页
多态性实验报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

多态性实验报告.docx

《多态性实验报告.docx》由会员分享,可在线阅读,更多相关《多态性实验报告.docx(18页珍藏版)》请在冰豆网上搜索。

多态性实验报告.docx

多态性实验报告

洛阳理工学院实验报告

系别

计算机与信息工程系

班级

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;i

s[i]=0;

/*cout<<"***建立一个集合***\n";*/

}

voidset:

:

input()

{

cout<<"请输入集合的长度"<

cin>>len;

cout<<"请输入集合元素"<

for(inti=0;i

cin>>s[i];

}

intset:

:

length()

{

returnlen;

}

/*intset:

:

getd()

{

returnlen;

}*/

voidset:

:

disp()

{

if(0==len)

cout<<"空集"<

else

{

for(inti=0;i

cout<

cout<

}

}

setset:

:

operator*(sets1)

{

setm;

inti,j;

for(i=0;i

for(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;j

if(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;i

m.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说明,并在派生类中重新定义的函数,且在派生类中重工业新定义时,其函数原型,包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的完全相同。

此外,构造函数不能是虚函数,但析构函数可以是虚函数。

 

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

当前位置:首页 > 解决方案 > 工作计划

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

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