多态及虚函数、运算符重载.doc
《多态及虚函数、运算符重载.doc》由会员分享,可在线阅读,更多相关《多态及虚函数、运算符重载.doc(6页珍藏版)》请在咨信网上搜索。
实验六 多态和虚函数、运算符重载 2012/15 学 号 1108324054 姓 名 王迎博 时 间 2012/6/15 专 业 网络工程 班 级 2011级网络工程 一、实验题目:形状类的设计与实现 二、实验目的: (1)理解虚函数的特性。 (2)理解纯虚函数和抽象类的特性。 (3)掌握用虚函数实现运行时的多态的方法。 三、实验内容: (1) 程序Ex_Shape:定义一个抽象类 CShape,包括纯虚函数Area(用于计算面积)和SetData(用于重设形状大小),然后派生出三角形CTriangle类、矩形CRect类、圆CCircle类,分别求其面积.最后定义一个CArea类,计算这几个形状的面积之和,各形状的数据通过CArea类构造或成员函数来设置,编写一个完整的程序。 (2) 程序Ex_Complex:定义一个复数类CComplex,通过重载运算符“*”和“/”,直接实现两个复数之间的乘除运算。运算符“*”用成员函数实现重载,而运算符“/”用友元函数实现重载。编写一个完整的程序(包括测试运算符的程序部分)。 提示:两复数相乘的计算公式为:(a+bi)*(c+di)=(ac-bd)+ad+bc),而两复数相除的计算公式为:(a+bi)/(c+di)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d)i。 四、实验步骤: 1、 创建工作文件夹 2、 输入并运行Ex_Shape.cpp的具体步骤如下。 (1) 启动Virtual C++6.0 (2) 单击标准工具栏上的“New Text File”按钮,在新打开的文档窗口中输入下列程序代码: #include<iostream.h> class CShape { public: virtual float Area()=0; //将Area定义成纯虚函数 virtual void SetData(float f1,float f2)=0;//将SetData定义成纯虚函数 }; class CTriangle:public CShape { public: CTriangle(float h=0,float w=0) {H=h;W=w;} float Area() //在派生类定义纯虚函数的具体实现代码 {return(float)(H*W*0.5);} void SetData(float f1,float f2) {H=f1;W=f2;} private: float H,W; }; class CRect:public CShape { public: CRect(float h=0,float w=0) {H=h;W=w;} float Area() //在派生类定义纯虚函数的具体实现代码 {return(float)(H*W);} void SetData(float f1,float f2) {H=f1;W=f2;} private: float H,W; }; class CCircle:public CShape { public: CCircle(float r=0) {R=r;} float Area() //在派生类定义纯虚函数的具体实现代码 {return(float)(3.14159265*R*R);} void SetData(float r,float) // 保持与虚函数一致 {R=r;} private: float R; }; class CArea { public: CArea(float triWidth,float triHeight,float rcWidth,float rcHeight,float r) { ppShape=new CShape*[3]; ppShape[0]=new CTriangle(triWidth,triHeight); ppShape[1]=new CRect(rcWidth,rcHeight); ppShape[2]=new CCircle(r); } ~CArea() { for(int i=0;i<3;i++) delete ppShape[i]; delete[]ppShape; } void SetShapeData(int n,float f1,float f2=0) //n为0表示操作的是三角形,1表示矩形,2表示圆形 { if((n>2)||(n<0))return; ppShape[n]->SetData(f1,f2); } void CalAndPrint(void) //计算并输出 { float fSum=0.0; char*str[3]={"三角","矩","圆"}; for(int i=0;i<3;i++) { float area=ppShape[i]->Area(); //通过基类指针,求不同形状的面积 cout<<str[i]<<"形面积是: "<<area<<endl; fSum+=area; } cout<<"总面积是: "<<fSum<<endl; } private: CShape**ppShape; //指向基的指针数组 }; void main() { CArea a(10,20,6,8,6.5); a.CalAndPrint(); a.SetShapeData(0,20,30); //重设三角形大小 a.CalAndPrint(); a.SetShapeData(2,11); //重设圆的半径大小 a.CalAndPrint(); a.SetShapeData(1,2,5); //重设矩形的大小 a.CalAndPrint(); return 0; } (3) 单击标准工作栏的Save按钮,将文件保存到指定地点,并命名。 (4) 编译运行。 3、输入并运行程序Ex_Complex的具体步骤如下。 (1) 选择“文件”à“关闭工作区间”,关闭原来的项目。 (2) 单击标准工具栏上的“New Text File”按钮,在新打开的文档窗口中输入下列程序代码: #include<iostream.h> class CComplex { public: CComplex(double r=0,double i=0) {realPart=r;imagePart=i;} void print() {cout<<"该复数实部="<<realPart<<",虚部="<<imagePart<<endl;} CComplex operator*(CComplex &b);//成员函数重载运算符* friend CComplex operator/(CComplex &a,CComplex &b);友元函数重载运算符 private: double realPart; //复数的实部 double imagePart; //复数的虚部 }; CComplex CComplex::operator*(CComplex &b) { CComplex temp; temp.realPart=realPart*b.realPart-imagePart*b.imagePart; temp.imagePart=realPart*b.imagePart+imagePart*b.realPart; return temp; } CComplex operator/(CComplex &a,CComplex &b) { CComplex temp; double d=b.realPart*b.realPart+b.imagePart*b.imagePart; temp.realPart=(a.realPart*b.realPart+a.imagePart*b.imagePart)/d; temp.imagePart=(a.imagePart*b.realPart-a.realPart*b.imagePart)/d; return temp; } void main() { CComplex c1(12,20),c2(50,70),c; c=c1*c2; c.print(); c=c1/c2; c.print(); } 五、分析与体会: 1、象程序设计多态性是面向对象程序设计的重要特征之一,他与封装性和继承性构成了面向对的三大特征。所谓多态性,是指不同类型的对象接受相同的消息是产生不同的行为。这里的消息主要是指对类的成员函数的调用,而不同的行为是指成员函数的不同实现。如:函数重载就是多态的典型例子。 2、此程序中定义了一个抽象类CShape,包含纯虚函数Area和SetData,Area用于计算各个形状的面积,SetData用于重设各个形状的大小。程序代码中虚函数Area和SetData是通过在基类函数的前面加上 virtual关键字来实现的。程序中ppShape是定义的基类CShape的指针,通过语句ppShape[0]=newTriangle(triWidth,triHeight);ppShape[1]=new(rcWidth,rcHeight);ppShape[2]=new CCircle(r);是将ppShape[0]、ppShape[1]和ppShape[2]分别获得对派生类CTriangle、CRect和CCircle的成员函数的调用,因而语句ppShape[n]->SetData(f1,f2);根据n值的不同调用不同的形状类的area函数,例如:为重设大小之前,n=0时ppShape[0]->SetData(10,20),调用三角形的area函数,结果为100,与输出结果相同。然后用SetShapeData来重设形状的大小,再次调用area函数进行计算,最后输出。 3、在定义基类CShape时,为了可以定义基类中虚函数的具体实现,将基类中的虚函数定义成了纯虚函数,在纯虚函数后面多了一个“=0”。并且纯虚函数的具体实现代码是在派生类中定义的。只有这样才能使抽象类CShape获得派生类的对象。纯虚函数是一种特殊的虚函数。 4、虚函数再重新定义时参数的个数和类型必须和基类中的虚函数完全匹配,这一点与函数重载完全不同。 5、只有通过积累指针才能实现虚函数的多态性,若虚函数的调用是普通方式来进行的,则不能实现其多态性。如: CShape ss; ss.area(); 将得到0.0。 6、虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态的成员函数。 7、可把析构函数定义为虚函数,但不能把构造函数定义为虚函数。 8、通过实验我发现自己的动手能力非常需要提高,同时也需要贯彻认真负责的态度,细致耐心的做好每次程序。 实验指导老师(签字): 实验成绩 年 月 日- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 运算 重载
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【仙人****88】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【仙人****88】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【仙人****88】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【仙人****88】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文