已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验2 派生类与继承实验课程名:面向对象程序设计(C+)专业班级: 学号: 姓名: 实验时间: 实验地点: 指导教师: 2.1实验目的和要求(1) 掌握派生类的声明方法和派生类构造函数的定义方法。(2) 掌握不同继承方式下,基类成员在派生类中的访问属性。(3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。(4) 学习虚基类在解决二义性问题中的作用。二、实验内容一、构造一个类Geometry及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数),求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。 试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。CircleradiumsCircle()Circle()BallBall()Ball()GeometryGeometry()Geometry()GetArea()GetPerimeter()Getcolume()show()ColumnColumn()Column()RectangleRectangle()Rectangle()实验代码如下:#includeusing namespace std;class Geometrypublic:Geometry()Geometry() double GetArea()/求面积函数double GetPerimeter()/求体积函数double Getcolume()/求周长函数virtual show();class Circle:public Geometrypublic:Circle(double i)radiums=i;Circle() double GetArea(); double Getcolume();double R()return radiums; show();private:double radiums;double Circle:GetArea()double S;S=3.14*radiums*radiums;return S;double Circle:Getcolume()double L;L=2*3.14*radiums;return L;Circle:show()cout圆的面积为:GetArea() 周长为:Getcolume()endl;class Rectangle:public Geometrypublic:Rectangle(double i,double j)length=i;wide=j;Rectangle() double GetArea(); double Getcolume();double L()return length; show();private:double length;double wide;double Rectangle:GetArea()double S;S=length*wide;return S;double Rectangle:Getcolume()double L;L=2*(length+wide);return L;Rectangle:show()cout矩形的面积为:GetArea() 周长为:Getcolume()endl;class Ball:public Circlepublic:Ball(double i):Circle(i);Ball();double GetArea(); double GetPerimeter(); show();double Ball:GetArea()double S;S=4*3.14*R()*R();return S;double Ball:GetPerimeter()double V;V=(4/3)*3.14*R()*R()*R();return V;Ball:show()cout球的体积为:GetPerimeter() 表面积为:GetArea()endl;class Column:public Circle,public Rectanglepublic:Column(double i,double j,double k):Circle(i),Rectangle(j,k); Column(); double GetArea(); double GetPerimeter(); show();double Column:GetArea()return(2*3.14*R()*R()+2*3.14*R()*L();double Column:GetPerimeter()return(3.14*R()*R()*L();Column:show()cout圆柱的体积为:GetPerimeter() 表面积为:GetArea()endl;int main()Circle circle(2.5);circle.show();Rectangle rectangle(3,4); rectangle.show();Ball ball(3.3);ball.show(); Column column(1,2,3);column.show(); return 0;运行结果: 代码分析:1)首先定义基类Geometry,在定义基类的派生类Circle,Rectangle再定义以Circle,Rectangle为基类的派生类Column,以及以Circle为基类的派生类Ball;2)在定义派生类时用构造函数初始化私有成员;3)最后用类的对象来调用类函数;二、设计如下类:(1)建立一个Point类,表示平面中的一个点;建立一个Line类,表示平面中的一条线端,内含两个Point类的对象;建立Triangle类,表示一个三角形,内含三个Line类的对象构成一个三角形。(2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制(3)设计Triangle类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。实验代码:#include#includeusing namespace std;class Point /定义一个点的类,坐标为(x,y)public:Point(double i,double j)x=i;y=j;double x,y;class Linepublic:Line(double x1,double y1,double x2,double y2):p1(x1,y1),p2(x2,y2);double length();private:Point p1,p2;double Line:length()return(sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);class Trianglepublic:Triangle(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double x5,double y5,double x6,double y6): L1(x1,y1,x2,y2),L2(x3,y3,x4,y4),L3(x5,y5,x6,y6);int panduan(); double Area();void show();private:Line L1,L2,L3;int Triangle:panduan()double a=L1.length();double b=L2.length();double c=L3.length();if(a+bc&b+ca&a+cb) return 1;elsereturn 0;double Triangle:Area() double a=L1.length();double b=L2.length();double c=L3.length(); double s=(a+b+c)/2;return(sqrt(s*(s-a)*(s-b)*(s-c);void Triangle:show()if(panduan()cout三角形的面积为:Area()endl;elsecout不能构成三角形endl;int main()Triangle T1(0,0,0,1,0,0,1,0,0,1,1,0);Triangle T2(1,0,0,0,0,0,0,2,0,0,0,1);T1.show();T2.show();return 0;实验结果:实验分析:1) 在主函数中定义两个三角形的类,分别由三条边六个点组成,其中第一组能组成三角形,输出面积,第二组边不能组成三角形输出不能构成三角形;2) 定义点类时,定义两个浮点型数据,用来表示点的坐标,定义边类时定义两个顶点,表示两个端点组成线段,定义三角形类时,用三边表示三角形;3) 三角形的面积用海伦公式求得,在三角形中定义一个判断函数,判断三边能否组成三角形,当能组成三角形时则求面积并输出,当不能组成三角形时,输出不能构成三角形;三、定义一个基类MyArray,基类中可以存放一组整数,基类中有构造函数、析构函数、输入数据和输出数据的函数。class MyArraypublic:MyArray(int leng);MyArray;void Input();void Display(string);protected:int*alist;int length;(1)声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。(2)声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。(3)声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入的整数平均值的功能。(4) 声明一个NewArray类,同时继承了类SortArray,ReArray和AverArray,使得类NewArray的对象同时具有排序、倒置和求平均值的功能。在继承的过程中声明MyArray为虚基类,体会虚基类在解决二义性问题中的作用。实验代码:#include#includeusing namespace std;class Myarrayprotected:int *alist; int length;public: Myarray(int len) alist=new intlen;length=len; Myarray(); void input() int i; for(i=0;ilength;i+) cout输入数组的第i+1个元素:alisti; int getlen()return length; void display() for(int i=0;ilength;i+) coutalisti ; coutendl; ;class SortArray:virtual public Myarraypublic:SortArray(int n):Myarray(n)sort()int i,j,t;for(j=0;jlength-1;j+)for(i=0;ialisti+1)t=alisti;alisti=alisti+1;alisti+1=t;cout排序后数组为:;for(i=0;ilength;i+)coutalisti ;class averarray:virtual public Myarraypublic: averarray(int n):Myarray(n) float getaver() float aver; int sum=0,i; for(i=0;ilength;i+) sum+=alisti; aver=(float)sum/length; return aver; ;class rearray:virtual public Myarraypublic: rearray(int n):Myarray(n) void turn() int i,t,j=length-1; for(i=0;ilength/2;i+,j-) t=alisti;alisti=alistj;alistj=t; ;class nawarray:public rearray,public averarray,public SortArraypublic: nawarray(int n):Myarray(n),rearray(n),averarray(n),SortArray(n) ;int main()nawarray A(10); A.input(); A.display();A.sort(); cout输出平均值:endl;coutA.getaver()endl; cout倒置:0 : 1 : 2 : 3其中,0、1、2、3为队列中的元素,0是队头。在栈类中实现一个输出栈中内容的函数printStack,输出格式为:Stack member:| 3 | 2 | 1 | 0 |-其中,3、2、1、0是栈中元素,3为栈顶元素。(3)用多文件结构实现程序。三个类的定义放在一个头文件中,类的实现放在另一个源文件中。主程序用于测试你所设计的三个类的正确性。测试内容包括: 在队列中加入几个元素,用printQueue()打印队列内容,然后再从队列中取出这些元素,看是否正确 在栈中加入几个元素,用printStack()打印栈的内容,然后再从栈中取出这些元素,看是否正确 测试取队列长度的函数getQueueLength()的正确性 测试判断栈是否为空的函数empty()的正确性 实验代码:#includeusing namespace std;struct Nodeint data;Node *next;class LinkListpublic:LinkList(int a,int n);/构造函数LinkList()head=new Node;tail=new Node;head-next=NULL;tail-next=NULL;LinkList();/析构函数 int Length();/求链表长度的函数int puthead();/在头部插入元素的函数int puttail();/在尾部插入元素的函数void emoty();/检查链表是否为空的函数int gethead (); /从表头取出一个元素Node *head,*tail;int length; LinkList:LinkList(int a,int n)int i;Node *p,*q;head=new Node;head-data=a0;p=new Node;p-data=a1;head-next=p;for(i=2;idata=ai;p-next=q;p=q;tail=p;tail-next=NULL;LinkList:LinkList()Node *p,*q;p=head;while(p)q=p;p=p-next;delete q;int LinkList:Length()Node *p;int i=0;p=head;while(p)p=p-next;i+;return i;int LinkList:puthead()Node *p;p=new Node;cout请输入要插入的元素:p-data;p-next=head;head=p;return 0;int LinkList:puttail()Node *p;p=new Node; cout请输入要插入的元素:p-data;tail-next=p;tail=p;tail-next=NULL;return 0;void LinkList:emoty()if(!head-next)cout链表为空endl;elsecout链表不为空next;return p-data;delete p; class Queue:public LinkListpublic:Queue(int a,int n):LinkList(a,n);void inqueue();/入队函数void outqueue();/出队函数;void Queue:inqueue()LinkList:puttail();void Queue:outqueue()cout;while(head!=NULL)coutLinkList:gethead():;coutendl;class Stack:public LinkListpublic:Stac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年云南城市建设职业学院单招职业适应性测试题库及答案解析(名师系列)
- 2026年山东外事职业大学单招职业倾向性考试题库及答案解析(夺冠系列)
- 2026年安徽医学高等专科学校单招职业倾向性测试题库及答案解析(夺冠系列)
- 2026年广西电力职业技术学院单招职业倾向性考试必刷测试卷附答案解析
- 2026年信阳艺术职业学院单招职业技能测试题库及答案解析(名师系列)
- 2026年安阳职业技术学院单招职业技能测试题库及答案解析(名师系列)
- 房屋押金结算协议书
- 房屋捐赠协议书范本
- 房屋改造安全协议书
- 房屋权属变更协议书
- 校园无人配送车项目计划书
- GB/T 43564-2023中小学合成材料面层田径场地
- 《新媒体数据分析与应用》 课件全套 第1-10章 绪论、新媒体数据分析指标 -网络舆情数据分析
- 板框压滤机操作说明
- 创意美术《《千里江山图》》课件
- 教育版机器人入门教程(乐聚机器人)
- 教师基本功大赛 教育学与心理学模拟试题及答案1
- 国际海域划界测量技术方法
- 钻孔灌注桩监理平行检查表(汇编)
- 第13课《桥》教学设计 部编版(五四学制)语文六年级上册
- 2022年上海杨浦投资控股(集团)有限公司招聘笔试试题及答案解析
评论
0/150
提交评论