24李后浪c++实验三多态性.docx
- 文档编号:24563898
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:16
- 大小:63.67KB
24李后浪c++实验三多态性.docx
《24李后浪c++实验三多态性.docx》由会员分享,可在线阅读,更多相关《24李后浪c++实验三多态性.docx(16页珍藏版)》请在冰豆网上搜索。
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: "< cout<<"volumeis"< pt=&s1; cout<<"sphere: "< cout<<"volumeis"< pt=&y1; cout<<"cylinde: "< cout<<"volumeis"< 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)掌握了纯虚函数和抽象类的概念和用法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 24 后浪 c+ 实验 多态性