24李后浪c++实验三多态性.docx

上传人:b****2 文档编号:24563898 上传时间:2023-05-28 格式:DOCX 页数:16 大小:63.67KB
下载 相关 举报
24李后浪c++实验三多态性.docx_第1页
第1页 / 共16页
24李后浪c++实验三多态性.docx_第2页
第2页 / 共16页
24李后浪c++实验三多态性.docx_第3页
第3页 / 共16页
24李后浪c++实验三多态性.docx_第4页
第4页 / 共16页
24李后浪c++实验三多态性.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

24李后浪c++实验三多态性.docx

《24李后浪c++实验三多态性.docx》由会员分享,可在线阅读,更多相关《24李后浪c++实验三多态性.docx(16页珍藏版)》请在冰豆网上搜索。

24李后浪c++实验三多态性.docx

24李后浪c++实验三多态性

实验3多态性

实验课程名:

高级语言程序设计Ⅱ

专业班级:

12网工2班学号:

201240420224姓名:

李后浪

实验时间:

5.12-5.13实验地点:

K4-201指导教师:

祁文青

一、实验目的和要求

(1)了解多态性的概念。

(2)掌握运算符重载的基本方法。

(3)掌握虚函数的定义和使用方法。

(4)掌握纯虚函数和抽象类的概念和用法。

二、实验内容与步骤

1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。

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

}

程序的输出结果

D:

:

f1(double)1.23;

D:

:

f1(double)1.23;

D:

:

f2(double)1.23;

D:

:

f3(double)1.23;

D:

:

f3(double)3.14;

解释输出结果:

Pb为指向基类的指针变量,在派生类D的基类部分中,派生类的虚函数f1取代了基类原来的虚函数,因此在使基类指针pb指向基类的虚函数f1时,即指向了派生类的虚函数f1,而由于f2,f3均不为虚函数,所以基类指针还是指向基类的f2,f3.

2.编写一个程序,其中设计一个时间类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;

}

3.给出下面的抽象基类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;

}

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<<"201240420224李后浪"<

return0;

}

三、结论

(1)通过实验,了解了多态性的概念。

(2)掌握了运算符重载的基本方法。

(3)掌握了虚函数的定义和使用方法。

(4)掌握了纯虚函数和抽象类的概念和用法。

 

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

当前位置:首页 > 外语学习 > 英语考试

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

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