实验3多态性实验课程名:面向对象程序设计(C++方向)专业班级:学号:姓名:实验时间:实验地点:指导教师:一、实验目的和要求(1)了解多态性的概念。(2)掌握运算符重载的基本方法。(3)掌握虚函数的定义和使用方法。(4)掌握纯虚函数和抽象类的概念和用法。二、实验内容1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。//test5_1.cpp#includeiostreamusingnamespacestd;classB{public:virtualvoidf1(doublex){cout”B::f1(double)”xendl;}voidf2(doublex){cout”B::f2(double)”2*xendl;}voidf3(doublex){cout”B::f3(double)”3*xendl;}}classD:publicB{public:virtualvoidf1(doublex){cout”D::f1(double)”xendl;}voidf2(doublex){cout”D::f2(double)”2*xendl;}voidf3(doublex){cout”D::f3(double)”3*xendl;}};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定义的指针pb,当pb-f1(1.23),因为在基类中函数f1()为虚函数,所以在pb-f1(1.23)时,调用的是类D中的虚函数f1(),所以会输出D::f1(),因为函数f2(),f3()在基类中并没有定义为虚函数,所以当pb-f2(),pb-f3()时实际上调用的是基类B中的函数,即输出B::f2(),B::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;};程序代码:#includeiostream#includestringusingnamespacestd;classTime{public:Time(inth=0,intm=0,ints=0);Timeoperator+(Time&);voiddisptime(string);private:inthourse;intminutes;intseconds;};Time::Time(inth,intm,ints){if(h=0&&m=0&&m59&&s=0&&s59){hourse=h;minutes=m;seconds=s;}}TimeTime::operator+(Time&x){Timec;intp,q;c.hourse=hourse+x.hourse;c.minutes=minutes+x.minutes;c.seconds=seconds+x.seconds;while(c.seconds59){p=c.seconds/60;c.minutes=c.minutes+p;c.seconds=c.seconds-p*60;}while(c.minutes59){q=c.minutes/60;c.hourse=c.hourse+q;c.minutes=c.minutes-q*60;}returnc;}voidTime::disptime(stringn){coutnhourse:minutes:secondsendl;}intmain(){Timea(5,35,39),b(5,30,41);Timec;c=a+b;c.disptime(时间相加后为:);}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的圆柱体的表面积和体积。程序代码:#includeiostreamusingnamespacestd;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();doublevolume();};doublecube::surface_area(){doublearea;area=radius*radius*6;returnarea;}doublecube::volume(){doubleV;V=radius*radius*radius;returnV;}//球体classsphere:publiccontainer{public:sphere(doubleradius1):container(radius1){}doublesurface_area();doublevolume();};doublesphere::surface_area(){doublearea;area=4*3.14*radius*radius;returnarea;}doublesphere::volume(){doubleV;V=4*3.14*radius*radius*radius/3;returnV;}//圆柱体classcylinder:publiccube{public:cylinder(doubleradius1,doubleradius2):cube(radius1){radiu=radius2;}doublesurface_area();doublevolume();protected:doubleradiu;};doublecylinder::surface_area(){doublearea;area=3.14*radiu*radiu*2+2*3.14*radiu*radius;returnarea;}doublecylinder::volume(){doubleV;V=3.14*radiu*radiu*radius;returnV;}intmain(){cubea(6.0);sphereb(5.0);cylinderc(6.0,5.0);doublex,y;cout正方体表面积:a.surface_area()endl;cout正方体体积:a.volume()endl;cout球体表面积:b.surface_area()endl;cout球体体积:b.volume()endl;cout圆柱体表面积:c.surface_area()endl;cout圆柱体体积:c.volume()endl;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];};程序代码:#includeiostreamusingnamespacestd;#defineMAX100classset{public:set(){}voidinput(intd);intlength();intgetd(inti);voiddisp();setoperator+(set&s1);setoperator-(set&s1);setoperator*(set&s1);protected:intlen;ints[MAX];};voidset::input(intd){len=d;inti;for(i=0;ilen;i++){cins[i];}}voidset::disp(){inti;for(i=0;ilen;i++){couts[i];}coutendl;}setset::operator+(set&s1){inti,j,z,n=0;for(i=0;ilen;i++){for(j=0;js1.len;j++){if(s[i]==s1.s[j]){for(z=j;zs1.len;z++){s1.s[z]=s1.s[z+1];}s1.len--;}}}for(i=0;is1.len;i++){s[len]=s1.s[i];len++;}return*this;}setset::operator-(set&s1){inti,j,z;for(i=0;ilen;i++){for(j=0;js1.len;j++){if(s[i]==s1.s[j]){for(z=i;zlen;z++)s[z]=s[z+1];len--;}}}return*this;}setset::operator*(set&s1){inta[100];inti,j,w=0;for(i=0;ilen;i++){for(j=0;js1.len;j++){if(s[i]==s1.s[j]){a[w]=s[i];w++;}}}for(i=0;iw;i++){s[i]=a[i];}len=w;return*this;}intmain(){setA,B,C,D,E;intm,n;cout请输入集合A内元素个数:;cinm;cout请输入集合A内元素:;A.input(m);cout请输入集合B内元素个数:;cinn;cout请输入集合B内元素:;B.input(n);coutA并B(A+B):;C=A+B;C.disp();cout请输入集合A内元素个数:;cinm;cout请输入集合A内元素:;A.input(m);cout请输入集合B内元素个数:;cinn;cout请输入集合B内元素:;B.input(