已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验08:继承与多态实验学时:6实验类型:验证、设计实验要求:必修一、实验目的1理解继承的概念,了解面向对象设计中继承和多态的合理性;2掌握派生类的构造与析构;3掌握在对象中使用类层次和继承思想进行设计、实现和测试;4区别运行时的多态性的实现,理解重载与同名覆盖的差异;5理解虚函数与多态性;6实现运行时多态性的程序设计。二、实验内容 1Difine a class called PartFileledArrayWMax that is a derived class of the class PartFilledArray. The class PartFilledArrayWMax has one additional member variable named max_value that holds the maximum value stored in the array. Define a member accessor function named get_max that returns the maximum value stored in the array. Redefine the member function add_value and define two constructors, one of which has an int argument for the maximum number of entries in the array. Also define a copy constructor, an overloaded assignment operator, and a destructor. (A real class would have more member functions, but these will do for an exercise.)2某公司雇员(employee)包括经理(Manager)、技术人员(Technician)和销售员(Saleman)。开发部经理(developermanager)既是经理也是技术人员,销售部经理(salesmanager)既是经理也是销售员。以employee类为虚基类,派生出manager、technician和saleman类,再进一步派生出developermanager和salesmanager类。Employee类的属性包括姓名、职工号、工资级别、月薪(实发基本工资加业绩工资);操作包括月薪计算函数pay(),该函数要求输入请假天数,扣除应扣工资后,得出实发基本工资。Technician类派生的属性有每小时附加酬金和当月工作时数,以及研究完成进度系数,业绩工资为三者之积。也包括同名的pay函数,工资总额为基本工资加业绩工资。Saleman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay函数,工资总额为基本工资加业绩工资。Manager类派生的属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。而在developermanager类中,pay函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。在salesmanager类中,pay函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。 3继承范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。要求定义一个点类,包含x,y 坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;定义一个直线类,以两个点类对象作数据成员,定义显示、求面积及长度函数。编程测试所定义的类体系。程序#include #include #define PI 3.14159class Pointfriend class Line;protected:double x, y ;public:Point()x = 0 ; y = 0 ; Point(double xv,double yv) x = xv; y = yv; double Area()return 0;void Show() coutx=x y=yendl;class Circle :public Pointdouble radius;public:Circle() x = 0; y = 0; radius = 0; Circle(double xv,double yv,double vv):Point(xv,yv) /调用基类构造函数radius = vv;double Area()return PI*radius*radius;void Show()/访问基类的数据成员coutx=x y=yradius=radiusendl;class LinePoint start,end; /对象成员public:Line():start(0,0),end(0,0) /对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2) double GetLength() return sqrt(start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y);double Area()return 0;void Show()coutstart point:n;start.Show();coutend point:n;end.Show();void main()Point pt(0,0);Circle cl(100,100,10);Line ln1(0,0,100,100);coutpt.Area()endl;pt.Show();coutcl.Area()endl;cl.Show();coutln1. Area()tln1. GetLength()endl;ln1.Show();注意在Point 类中,将Line 类定义为友元,方便在Line 中访问;Point 的x 和y 定义为Protected访问权限,便于派生类访问。注意派生类的构造函数中对基类数据成员的初始化方法,以及构造函数中对对象成员的初始化。要求1) 建立工程,录入上述程序,改变数据实验之。2) 修改CPoint 类数据成员x,y 的访问权限为private,再运行,结果如何?3) 如果不将CLine 设为CPoint 的友元,应采取什么措施?为哪个类增加数据或函数成员?4多态范例定义一个抽象基类CElement,提供显示、求面积等公共接口(虚函数),派生出CPoint、CLine、CCircle、CArc 等图形元素类,并重定义(override)这些虚函数,完成各自的任务。再定义一个CElemList 链表类,存储CElement 的派生类。然后定义main 函数,生成多个图形元素插入链表中,通过链表的头指针逐个访问链表中的元素,输出所有图形元素。在这里,CElement 是抽象基类,它不能提供具体的显示等操作,应将其成员函数定义为纯虚函数。只有采用指向基类的指针或对基类的引用进行调用,实现的才是动态联编,完成运行时的多态性。程序/element.h#include double const PI=3.14159class CElement public:virtual void Show()=0;virtual double Area() = 0;CElement *Next;class CPoint:public CElementfriend class CLine;protected:double x,y;public:CPoint()x = 0; y = 0; CPoint(double xv,double yv)x = xv;y = yv;double Area()return 0;void Show()coutx=x y=yendl;class CCircle :public CPointdouble radius;public:CCircle() x = 0; y = 0; radius = 0; CCircle(double xv,double yv,double vv):CPoint(xv,yv)radius = vv;double Area()return PI*radius*radius;void Show()coutx=x y=y radius=radius ”Area=”Area()endl;class CLine:public CElementCPoint start,end;public:CLine():start(0,0),end(0,0)CLine(double xv1,double yv1,double xv2,double yv2):start(xv1,yv1),end(xv2,yv2) ;double GetLength()return sqrt(start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y);double Area()return 0;void Show()coutstart point:n;start.Show();coutend point:n;end.Show();cout”Length=”GetLength()endl;class CElemListprotected:CElement *head; / 链表头指针定义为基类类型public:CElemList():head(NULL)CElemList();void Insert(CElement *); / 插入元素int Delete(CElement *); / 删除元素void Show(); / 显示所有元素CElement* GetHead() return head; / 取得链表头;/element.cpp#include #include element.hCElemList:CElemList()CElement *p = head,*p2;while(p)p2 = p;p = p-Next;delete p2;return ;void CElemList:Insert(CElement *elem)elem-Next = head; / 在表头插入结点head = elem;int CElemList:Delete(CElement * elem)CElement *p1 = head,*p2 = head;while(p1&p1!=elem)p2 = p1,p1 = p1-Next;if(p1=elem)if(p1!=head) p2-Next = p1-Next;else head = head-Next;delete p1;return 1;else return 0;void CElemList:Show()CElement *p = head;while(p) / 通过基类指针调用派生类成员函数,实现运行时多态性p-Show();p = p-Next;return ;/exp16_1.cpp#include #include element.hvoid main()CElemList list; / 定义链表类对象CElement *p1 = new CLine(100,100,100,200);list.Insert(p1);list.Show();coutendl;p1 = new CCircle(200,100, 20);list.Insert(p1);list.Show();coutendl;list.Delete(p1);list.Show();coutendl;要求1) 建立工程,录入上述程序,改变数据实验之。2) 若将CElement 的两个虚函数virtual 关键词删除,再运行,结果如何?3) 为保证类的通用性,析构函数总是定义为虚函数,修改之。养成这种习惯。三、实验原理、方法和手段1派生类的定义:class 派生类名:访问限定符 基类名1,访问限定符 基类名2,访问限定符 基类名n private: 成员表1; /派生类增加或替代的私有成员public:成员表2; /派生类增加或替代的公有成员protected:成员表3; /派生类增加或替代的保护成员;/分号不可少2虚函数的定义虚函数是一个类的成员函数,定义格式如下:virtual 返回类型 函数名(参数表);关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可再加virtual。四、实验组织运行要求本实验采用“以集中上机,学生自主训练,教师指导答疑“的方式进行。五、实验条件微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。六、实验步骤1派生的四个步骤:编制派生类时可分四步 吸收基类的成员 改造基类成员 发展新成员 重写构造函数与析构函数 不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收 声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override) 派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。 2派生类的定义class 派生类名:访问限定符 基类名1,访问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 20354-2026地理标志产品质量要求安吉白茶
- 2025-2030中国尼龙(PA)行业需求预测及未来营销渠道分析报告
- 《小小商品展示会》教案-2025-2026学年赣美版小学美术四年级下册
- 中国磷化工产业发展趋势
- 铁路运输安全监管体系构建
- 玻璃生产厂能耗控制办法
- 非遗豫剧艺术:唱腔流派与经典剧目赏析
- 麻纺厂档案管理实施办法
- 某印刷公司印刷品质量细则
- 一例内固定术后患者的护理个案
- 2025年上海银行间市场清算所股份有限公司招聘笔试参考题库附带答案详解
- 玉盘二部合唱简谱
- 退休人员兼职合同范本
- JCI医院评审标准(第六版)
- 出口退税管理培训课件
- 2024中国电信集团限公司采购事业部专业岗位员工招聘高频考题难、易错点模拟试题(共500题)附带答案详解
- 高新技术产品进出口统计目录
- 仿生蝴蝶设计说明书
- 2024年安徽交控集团招聘笔试参考题库含答案解析
- (协议书)建房安全责任协议书
- 公务员考试常识考试题库1000题(含参考答案)
评论
0/150
提交评论