实验三2012221010021-戴嘉乐-标准实验报告(C++)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

电子科技大学实验报告学生姓名:戴嘉乐学号:2012221010021指导教师:陈安龙实验地点:信软楼305实验时间:2013.12.16一、实验室名称:软件实验室二、实验项目名称:面向对象程序设计—继承和多态三、实验学时:8四、实验原理:在面向对象语言中,类功能支持层次机制。除了根结点外,每个类都有它的基类(baseclass)。除了叶结点外,每个类都有它的派生类(derivedclass)。一个派生类可以从它的基类那里继承所有的数据和操作,并扩充自己的特殊数据和操作。基类抽象出共同特征,派生类表达其差别。有了类的层次结构和继承性,不同对象的共同性质只需定义一次,用户就可以充分利用已有的类,符合软件重用的目标。面向对象另外一个核心概念是多态性。所谓多态,是指一个名字(或符号)具有多种含义。这对仿真客观世界以及提升软件的灵活性有相当重要的意义。在面向对象的程序设计语言中,多态是通过重载(overload)来实现的。对于函数重载,若函数调用(接口)与对应的函数体(函数实现)相匹配,是在编译时确定的,称为早期匹配(earlybinding)(或静态联编);如果函数调用与对应的函数体的匹配是在运行时动态进行的,称之为晚期匹配(latelybinding)(或动态联编)。一般来说,早期匹配执行速度比较快,晚期匹配提供灵活性和高度的问题抽象。在C++中,相同范围(scope)内的同名函数一般体现了早期匹配,而继承链中的虚函数(virtualfunction)提供了晚期匹配带来的良好特征。普通函数重载强调的是函数名相同,函数参数和函数体不相同(编译能根据参数的差别进行识别和匹配)。虚特性的函数则强调单接口多实现版本的方法,亦即函数名、返回类型、函数参数的类型、顺序、个数完全相同,但函数体可以完全不同。在C++中,通过继承关系,基类及其派生类之间构成一个树形结构(多重继承为图结构),树中的每个类(基类或派生类)都可以说明一个具有虚特性的函数,称为虚函数。那么在这个类及其派生类中都可以定义这个虚函数的不同实现,但要求这些不同实现必须遵守相同的函数接口,否则虚特性丢失。使用时,系统能在运行时刻动态地寻找所需的实现版本。C++语言中的继承机制和虚函数使得软件可扩充性更为自然。可以继承基类拥有的所有特性,然后加进派生类所需要的特殊的东西,使派生类对象以相似的方式工作并具有新的功能。派生类定义的类型及其虚函数版本是有规则的功能等级的真正扩充。由于这是语言设计的一部分,不是编程时才有的想法,所以很容易实现软件的可扩充性。五、实验目的:本实验通过编写一些简单的程序,使学生掌握继承和多态的概念,并能熟练运用继承的语法、多态的语法(虚函数、纯虚函数和抽象类),培养理论联系实际和自主学习的能力,提高程序设计水平。此外,本次实验将初步涉足Windows窗口应用程序的设计。六、实验内容:1.继承的实现(4学时)Quadrangle类以及五种形体类实际上呈现出明显的层次特征:最高层次的Quadrangle表达了最基本的形体建模思想,其下是平行四边形和梯形;而矩形和菱形属于平行四边形;正方形是一种特殊的矩形。请根据这样的描述用继承的语法写出各种形体类的继承情况。注意:既然Quadrangle是跟类,那么它应该包括其它形体类所有的操作。当然,这些操作应该都没有具体含义。注意:请将此步做完后再进行下一步。2.多态的实现(4学时)Quadrangle表达了最基本的形体,但其操作没有实际意义。因此,它应该是个抽象类,而其所有操作都是纯虚函数。请将编写好的其它形体类加以改造,用以实现多态。注意:每个纯虚函数都应该有一个最终覆盖函数。否则,代码就是病态的。注:请将此实验编写的代码完整保存,此后的附加实验都要以本次实验的代码为基础。附加实验为选作。七、实验器材(设备、元器件):PC机一台,装有C/C++语言集成开发环境。八、实验步骤:步骤一:按照实验指导书,做出如下准备工作:1)将提供的压缩包解压到任一磁盘上,例如D:,将生成一个experiment文件夹;2)将你写好的如下文件拷贝到D:\experiment\experiment文件夹下:(1)List.h和list.cpp(2)Quadrangle和其他五种形体的.h和.cpp文件3)双击D:\experiment\experiment.sln,启动工程,然后将上述源文件添加到该工程中。具体做法是:在“解决方案资源管理器”面板中,右击解决方案的名字,然后选择“添加”-“现有项…”,在弹出的对话框中选择需要的源文件按“添加”按钮。此后在文件列表中拖拽源文件名,将其放到适当的列表项下面。4)打开stdafx.h文件,然后将所有你编写的头文件用#include指令添加在最后。注意头文件包含的先后顺序;5)保存工程,准备工作完成。步骤二:(在实验一、二的文件下添加如下代码)修改list.h代码如下://list.h#ifndef_LIST_H#define_LIST_H#includequad.h#includeiostream#includestringclassList{private:structNode{QUADPTRdata;Node*next;Node(QUADPTRd):data(d){}}*head,*tail;size_tlen;public:List():head(NULL),tail(NULL){len=0;}List(Listconst&l){head=tail=NULL;Node*p=l.head;while(p!=NULL){this-push_back(p-data);p=p-next;}len=0;}~List(){Node*p=head,*q;while(p!=NULL){q=p;p=p-next;deleteq;}}voidpush_back(constQUADPTRquad){Node*p=newNode(quad);p-next=NULL;if(tail==NULL)head=tail=p;else{tail-next=p;tail=p;}len++;}Node*Tail(){returntail;}size_tsize(){returnlen;}voidtraverse(void(*f)(constQUADPTR&)){Node*p=head;inti=1;cout现在复习之前学过的四边形:endl;while(p!=NULL){cout第i++个endl;f(p-data);p=p-next;}}intpop_back(){if(len==0)returnlen;Node*cur=head;if(cur==tail){deletecur;head=tail=NULL;}else{while(cur-next!=tail)cur++;deletetail;tail=cur;tail-next=NULL;}len--;returnlen;}List&operator=(constList&l){head=tail=NULL;Node*p=l.head;while(p!=NULL){this-push_back(p-data);p=p-next;}len=0;return*this;}List&operator+=(constQUADPTR&data){Node*p=newNode(data);p-next=NULL;if(tail==NULL)head=tail=p;else{tail-next=p;tail=p;}len++;return*this;}QUADPTR&operator[](size_tnum){Node*p=head;for(size_ti=1;i=num;i++){p=p-next;}returnp-data;}};#endif修改quad.h代码如下:#ifndef__QUADRANGLE__#define__QUADRANGLE__//Quadrangle类是最基础的类,将Quadrangle修改为抽象类#includeCanvas.hclassQuadrangle{protected:stringname;//Quadrangle类是基类,其成员name不必公有public:Quadrangle(stringn=Quadrangle):name(n){}stringwhat()const{returnname;}virtualdoublearea()const=0;virtualvoiddraw()const=0;//设置area()和draw()为纯虚函数};typedefQuadrangle*QUADPTR;#endif修改diamond.h代码如下:#ifndef__DIAMOND__#define__DIAMOND__#includeparallelogram.hclassDiamond:publicParallelogram{public:Diamond(stringn=Diamond,intd1=35,intd2=37):Parallelogram(n,d1,d2){}stringwhat()const{returnParallelogram::what();}doublearea()const{returnParallelogram::area();}voiddraw()const{Parallelogram::draw();}doubleWidth()const{returnd1;}doubleHeight()const{returnd2;}//重载area(),draw(),width(),height()成员函数//将作为友元重载friendostream&operator(ostream&os,constDiamond&c2);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Diamond&operator=(constDiamond&di){name=di.name;d1=di.d2;d1=di.d2;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/protected:intd1,d2;//高和宽};#endif修改parallelogram.h代码如下:#ifndef__PARALLELOGRAM__#define__PARALLELOGRAM__#includeiostream#includequad.hclassParallelogram:publicQuadrangle{public:Parallelogram(stringn=Parallelogram,intw=15,inth=17):Quadrangle(n),width(w),height(h){}voiddraw()const{Canvas::drawQuad(this);}doublearea()const{returnwidth*height;}stringwhat()const{returnQuadrangle::what();}doubleWidth()const{returnwidth;}doubleHeight()const{returnheight;}//重载area(),draw(),width(),height()成员函数//将作为友元重载friendostream&operator(ostream&os,constParallelogram&c3);/*重载=运算符,用以完成两个相同类型形体对象的赋Start*/Parallelogram&operator=(constParallelogram&pa){name=pa.name;width=pa.width;height=pa.height;return*this;}/*重载=运算符,用以完成两个相同类型形体对象的赋End*/protected:intwi

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功