2022年c++派生类与继承实验报告 .pdf

上传人:Che****ry 文档编号:23794084 上传时间:2022-07-02 格式:PDF 页数:28 大小:409.96KB
返回 下载 相关 举报
2022年c++派生类与继承实验报告 .pdf_第1页
第1页 / 共28页
2022年c++派生类与继承实验报告 .pdf_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《2022年c++派生类与继承实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年c++派生类与继承实验报告 .pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验 2 派生类与继承实验课程名:面向对象程序设计(C+ )专业班级:学号:姓名:实验时间:实验地点:指导教师:2.1 实验目的和要求(1) 掌握派生类的声明方法和派生类构造函数的定义方法。(2) 掌握不同继承方式下,基类成员在派生类中的访问属性。(3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。(4) 学习虚基类在解决二义性问题中的作用。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 28 页 - - - - - - - - - 二、实

2、验内容一、构造一个类Geometry及其派生类,该类主要实现关于几何图形的基本操作。对于基类“几何图形”,有求面积、求体积的函数(纯虚函数),其派生类圆和矩形主要有初始化(构造函数) ,求面积,求周长操作,类圆的派生类圆球和圆柱有求表面积、体积操作。试在主函数中分别定义圆、圆球、圆柱以及矩形的对象,并调用其成员函数实现其相应操作。实验代码如下:#include using namespace std; class Geometry public: Circle radiums Circle() Circle() Ball Ball() Ball() Geometry Geometry() Ge

3、ometry() GetArea() GetPerimeter() Getcolume() show() Column Column() Column() Rectangle Rectangle() Rectangle() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 28 页 - - - - - - - - - Geometry() Geometry() double GetArea()/求面积函数double GetPerimeter()/求体积函

4、数double Getcolume()/求周长函数virtual show() ; class Circle:public Geometry public: Circle(double i) radiums=i; Circle() double GetArea(); double Getcolume(); double R() return radiums; show(); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 28 页 - - - - - -

5、 - - - 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 Geometry 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整

6、理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 28 页 - - - - - - - - - public: 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;

7、return S; double Rectangle:Getcolume() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 28 页 - - - - - - - - - double L; L=2*(length+wide); return L; Rectangle:show() cout矩形的面积为: GetArea() 周长为:Getcolume()endl; class Ball:public Circle public: Ball(double

8、 i):Circle(i); Ball(); double GetArea(); double GetPerimeter(); show(); ; double Ball:GetArea() double S; S=4*3.14*R()*R(); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 28 页 - - - - - - - - - return S; ; double Ball:GetPerimeter() double V; V=(4/3)*3

9、.14*R()*R()*R(); return V; Ball:show() cout球的体积为: GetPerimeter() 表面积为: GetArea()endl; class Column:public Circle,public Rectangle public: Column(double i,double j,double k):Circle(i),Rectangle(j,k); Column(); double GetArea(); double GetPerimeter(); show(); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - -

10、-精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 7 页,共 28 页 - - - - - - - - - ; 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()

11、; Rectangle rectangle(3,4); rectangle.show(); Ball ball(3.3); ball.show(); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 28 页 - - - - - - - - - Column column(1,2,3); column.show(); return 0; 运行结果:代码分析:1)首先定义基类Geometry, 在定义基类的派生类Circle,Rectangle 再定义以 C

12、ircle,Rectangle 为基类的派生类 Column ,以及以 Circle 为基类的派生类 Ball;2)在定义派生类时用构造函数初始化私有成员;3)最后用类的对象来调用类函数;二、设计如下类:(1)建立一个Point 类,表示平面中的一个点;建立一个Line 类,表示平面中的一条线端,内含两个Point 类的对象;建立Triangle 类,表示一个三角形,内含三个Line 类的对象构成一个三角形。(2)设计三个类的相应的构造函数、复制构造函数,完成初始化和对象复制(3)设计Triangle 类的成员函数完成三条边是否能构成三角形的检验和三角形面积计算,面积显示。实验代码: #inc

13、lude #include using namespace std; class Point /定义一个点的类,坐标为(x,y) public: Point(double i,double j)x=i;y=j; double x,y; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 9 页,共 28 页 - - - - - - - - - ; class Line public: Line(double x1,double y1,double x2,double y

14、2):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 Triangle public: 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):

15、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; else return 0; double Triangle:Area() double a=L1.length(); doub

16、le 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() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 10 页,共 28 页 - - - - - - - - - if(panduan() cout 三角形的面积为: Area()endl; else cout 不能构成三角形 endl; int

17、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) 三角形的面积用海伦公式求得,在三角形中定义一个判断函数,判断三边能否组成

18、三角形,当能组成三角形时则求面积并输出,当不能组成三角形时,输出不能构成三角形;三、 定义一个基类MyArray ,基类中可以存放一组整数,基类中有构造函数、析构函数、输入数据和输出数据的函数。class MyArray public: MyArray(int leng); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 11 页,共 28 页 - - - - - - - - - MyArray; void Input(); void Display(string)

19、; protected: int*alist; int length; ; (1)声明一个类SortArray 继承类 MyArray, 在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。(2)声明一个类ReArray 继承类 MyArray, 在该类中定义一个函数,具有将输入的整数进行倒置的功能。(3)声明一个类AverArray 继承类MyArray, 在该类中定义一个函数,具有求输入的整数平均值的功能。(4) 声明一个NewArray类,同时继承了类SortArray,ReArray和 AverArray, 使得类NewArray 的对象同时具有排序、倒置和求平均值的功能。在

20、继承的过程中声明MyArray为虚基类,体会虚基类在解决二义性问题中的作用。实验代码:#include #include using namespace std; class Myarray protected: int *alist; int length; public: Myarray(int len) alist=new intlen;length=len; Myarray(); void input() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 12

21、 页,共 28 页 - - - - - - - - - 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 Myarray public: SortArray(int n):Myarray(n) sort() 名师归纳总结 精品学习资料 - - - - - - - - - - - -

22、- - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 13 页,共 28 页 - - - - - - - - - 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 Myarray 名师归纳总结 精品学习资料 - - - - - - - - - - - - -

23、- -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 14 页,共 28 页 - - - - - - - - - public: 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 Myarray public: rearray(int n):Myarray(n) v

24、oid turn() int i,t,j=length-1; for(i=0;ilength/2;i+,j-) 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 15 页,共 28 页 - - - - - - - - - t=alisti; alisti=alistj; alistj=t; ; class nawarray:public rearray,public averarray,public SortArray public: nawarray(int n):

25、Myarray(n),rearray(n),averarray(n),SortArray(n) ; int main() nawarray A(10); A.input(); A.display(); A.sort(); cout输出平均值: endl; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 16 页,共 28 页 - - - - - - - - - coutA.getaver()endl; cout倒置 :0 : 1 : 2 : 3 其中, 0、1、2、

26、3 为队列中的元素,0 是队头。在栈类中实现一个输出栈中内容的函数printStack,输出格式为:Stack member: | 3 | | 2 | | 1 | | 0 | - 其中, 3、2、1、0 是栈中元素, 3 为栈顶元素。(3)用多文件结构实现程序。三个类的定义放在一个头文件中,类的实现放在另一个源文件中。主程序用于测试你所设计的三个类的正确性。测试内容包括:?在队列中加入几个元素,用printQueue() 打印队列内容,然后再从队列中取出这些元素,看是否正确?在栈中加入几个元素,用printStack()打印栈的内容,然后再从栈中取出这些元素,看是否正确?测试取队列长度的函数g

27、etQueueLength()的正确性?测试判断栈是否为空的函数empty()的正确性实验代码:#include using namespace std; struct Node int data; Node *next; ; class LinkList public: 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 19 页,共 28 页 - - - - - - - - - LinkList(int a,int n);/构造函数LinkList()head=ne

28、w 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

29、; 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() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 21 页,共 28 页 - - - -

30、- - - - - 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() 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 22 页,共 28 页 - - - - -

31、- - - - 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; else cout链表不为空 next; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 23 页,共 28 页 - - - - - - - - - return p-d

32、ata; delete p; class Queue:public LinkList public: 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():; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - -

33、 - - - - - - - - - - - - - 第 24 页,共 28 页 - - - - - - - - - coutendl; class Stack:public LinkList public: Stack():LinkList() int i=0; for(i=0;i10;i+) LinkList:puthead(); void instack();/入栈函数void outstack();/出栈函数; void Stack:instack() LinkList:puthead(); void Stack:outstack() 名师归纳总结 精品学习资料 - - - - - -

34、 - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 25 页,共 28 页 - - - - - - - - - cout; while(head-next) coutLinkList:gethead():; coutendl; int main() int a10=0,1,2,3,4,5,6,7,8,9; Queue queue(a,10); queue.inqueue(); queue.outqueue(); Stack stack; stack.outstack(); return 0; 运行结果:名师归纳总结 精

35、品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 26 页,共 28 页 - - - - - - - - - 程序分析:定义基类链表其中包含功能能够在链表的头尾增加节点以及在链表尾增加节点能够记录链表的个数(用静态成员)能返回链表中的节点个数能查看链表头节点的元素值能告知链表是否为空在链表类的构造函数中初始化链表在链表类的析构函数中释放链表所有元素的空间定义派生类队与栈, 队列初始化用链表的初始化函数,用 gettail 实现入队操作用gethead实现从队列的头部出对。栈中初始化用

36、函数puthead 实现从栈顶入栈,用函数gethead()实现从栈顶出栈。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 27 页,共 28 页 - - - - - - - - - 三、结论1)继承可以从基类中获得派生类中不曾定义过的成员,提高了编程效率;2)继承与派生分为共有、私有、保护三种继承方式,其中共有使用最广泛,它使得派生类与基类中的成员具有相同的属性。3)多重继承存在有二义性,用虚基类能有效解决这一问题。4)除了继承还有组合关系, 及在一个类中定义另一个类的对象,此时初始化时要用对象名来调用初始化函数。调用对应的函数时,要用对象名调用它的函数。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 28 页,共 28 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁