实验五 多态.docx
实验五多态程序设计一、实验目的:理解运算符重载的概念和实质,掌握运算符重载函数的定义方法,掌握运算符重载为类的成员函数和友元函数的方法。掌握虚函数的定义方法及其在实现多态性中的应用,理解静态连编和动态链编的区别。二、实验时间:三、实验地点:四、实验内容:1 .已知基类:c1assBasepub1ic:virtua1voidI_am()cout<<,Base,<<end1;);要求:(1)从BaSe类中派生出两个类,分别定义1amo函数,实现输出自己类的名字。(2)主函数中创建者3个类的对象来调用1am()函数,再利用Base的指针数组通过循环语句来调用这3个对象的1amo函数。2 .编写程序,计算圆柱体,球体,正方体的表面积和体积。要求用抽象类实现。3 .设计字符串类String,完成以下功能:(1)使用+运算符实现两个字符串的连接功能。(2)使用二运算符实现字符串的复制功能。(3)使用=运算符判断两个字符串是否相等功能。(4)计算字符串长度的功能。五、实验要求:在上机前写出全部源程序;六、实验结果分析:1、已知基类:c1assBasepub1ic:virtua1voidI-am()cout<<,Base,<<end1;);结果:代码:#inc1ude<iostream>usingnamespacestd;c1assBase(pub1ic:virtua1voidI_am()cout«"Basen«end1;);c1assBasekpub1icBase(pub1ic:virtua1void1am()cout<v"我是第一个继承Base的Base,<<end1;);c1assBase2:pub1icBase(pub1ic:virtua1void1am()cout<v"我是第二个继承Base的Base2',<<end1;);intmain()Basep,*a3;Base1p1;Base2p2;a0=&p;a1=&p1;a2J=&p2;for(inti=0;i<3;i+)(ai->I.am();)return0;2、编写程序,计算圆柱体,球体,正方体的表面积和体积。要求用抽象类实现。结果:1、计算圆柱体的体积和表面积1高2,4.J一:工BS为积一用的学CEEBENC+fi2x表面积和献.exe2、计算球体的体积和表面积E1BENC+52s表面Oa醐.exe2.S2i:;r D 5 1 2 4VHr 3 径56: :.565长半:鬻78,边的为奉体积国为整后加积面方圆表正人强人的的人 lnt清圆圆¾g3、计算正方体的体积和表面积E:BENC+52x表面Oa够exe2.S高 2.4.50 5 124 - 356:.565长47:中.zl78-:为 &军,R½f积体积ISS为量积面 H体羊株积面奈表圆的的球表正的的人注入的的人款方 Processreturned0<0×0>e×ecutiontime:172.178sPreSSanykeytocontinue.代码:#inc1ude<iostream>usingnamespacestd;constf1oatPI=3.14;抽象类c1assBase(pub1ic:virtua1voidDisp1ayO=0;虚函数protected:f1oatr1,r2,h,a;1;圆柱体类c1assCy1inder:pub1icBase(pub1ic:Cy1inder(f1oatpr1,f1oatPh)构造函数(r1=pr1;h=ph;f1oatCy1inderSurfaceAreaO(return2*PI*r1*r1+2*PI*r1*h;1f1oatCy1inderVo1umeO(returnPI*r1*r1*h;1voidDisp1ayO(cout«”圆柱体的体积为:"vvCyIinderSurfaceAreaO«end1;cout«"圆柱体的表面积为:"VVCy1inderVo1umeO«end1;11;球类c1assSphere:pub1icBase(pub1ic:Sphere(f1oatpr2)构造函数(r2=pr2;f1oatSphereSurfaceAreaOreturn4*PI*r2*r2;)f1oatSphereVo1umeO(return4.0/3*PI*r2*r2*r2;1voidDisp1ayO(cout«”球体的体积为:"vvSphereSurfaceArea()«end1;cout«"球体的表面积为:"«SphereVo1umeO«end1;11;正方体类c1assCube:pub1icBase(pub1ic:Cube(f1oatpa)构造函数(a=pa;f1oatCubeSurfaceAreaO(return6*a*a;f1oatCubeVo1umeO(returna*a*a;)voidDisp1ayO(cout«"正方体的体积为:"«CubeSurfaceArea()«end1;cout«"正方体的表面积为:"VVCubeVo1umeO«end1;1);intmain()(f1oatpr1,pr2,ph,pa;COUtVV”请输入圆柱体的半径和高:”;cin»pr1»ph;Cy1inderp1(pr1,ph);p1.Disp1ay();CoUtVV”请输入球体的半径:”;cin»pr2;Spherep2(pr2);p2.Disp1ay();cout«"请输入正方体的边长:cin»pa;Cubep3(pa);p3.Disp1ay();return0;)3、设计字符串类String结果:代码:#inc1ude<iostream>#inc1ude<string>#inc1ude<cstring>usingnamespacestd;c1assStringpub1ic:String()Stringoperator+(constString&a);String<fcoperator=(constString&a);intoperator=(constString&a);int1ength(constString&a);String(charx)(s=newchar1str1en(x)J;strcpy(s,x);String(constString&str)s=newcharstr1en(str.s)+1;strcpy(s,str.s);char*Get_s()returns;private:char*s;StringString:operator+(constString&a)(char*p=newchar1str1en(a.s)+str1en(this->s)+1;strcpy(p,this->s);strcat(p,a.s);returnString(p);String&String:operator=(constString&a)(s=newcharstr1en(a.s)+1;strcpy(s,a.s);return*this;)intString:1ength(constString&a)returnstr1en(a.s);intString:operator=(constString&a)if(strcmp(s,a.s)=O)returnO;e1sereturn1;)intmain()(Strings1="abc",s2="abcdfsDSF's3;cout<<',s1=abc<<ns2=abcdfsDSF<<end1;cout<<s1的长度为:"v<s1.1ength(s1)<<end1;cout<<s2的长度为:"v<s2.1ength(s2)<<end1;if(s1=s2)=0)(COUt<v"s1,s2相等!u<<end1;)e1secout<<ns1,s2不相等!,<<end1;s3=s1+s2;cout<<s1+s2="«s3.Get_s()«end1;returnO;)七、实验心得体会及问题反馈:本实验主要对面向对象多态的初步掌握。其中对运算符重载、虚函数、纯虚函数、抽象类的概念进一步深化。通过这些练习我也逐渐对面向对象过程理解更加深刻。多态主要是通过不同的类的不同的对象实现不同的方法。