实验六 继承与派生.doc_第1页
实验六 继承与派生.doc_第2页
实验六 继承与派生.doc_第3页
实验六 继承与派生.doc_第4页
实验六 继承与派生.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

继承与组合一、实验目的1了解继承在面向对象程序设计中的重要作用。2进一步理解继承与派生的概念。3掌握通过继承派生出一个新的类的方法。4了解虚基类的作用和用法。5掌握类的组合二、实验内容1请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。(1)#include using namespace std;class Apublic: A()coutA:A() called.n; virtual A()coutA:A() called.n; class B:public A public: B(int i) coutB:B() called.n; buf=new chari; virtual B() delete buf; coutB:B() called.n; private: char *buf; ; void fun(A *a) coutMay you succeed!endl; delete a; int main() A *a=new B(15); fun(a); return 0;1、(1)程序运行结果:A:A() called.B:B() called.May you succeed!B:B() called.A:A() called.(2)#includeusing namespace std;class Apublic:A(int a,int b):x(a),y(b) coutA constructor.endl;void Add(int a,int b) x+=a;y+=b;void display() cout(x,y);A()coutdestructor A.endl;private:int x,y;class B:private Aprivate:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d),Aobj(1,1) coutB constructor.endl;void Add(int x1,int y1,int x2,int y2)A:Add(x1,y1);i+=x2; j+=y2;void display()A:display();Aobj.display();cout(i,j)endl;B()coutdestructor B.endl; ;int main()B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display(); return 0;(2)程序运行结果:A constructor.A constructor.B constructor.(1,2) (1,1) (3,4)(2,5) (1,1) (8,11)destructor B.destructor A.destructor A.(3)#includeusing namespace std;class Apublic:A(int a):x(a) coutA constructor.xendl;int f()return +x;A()coutdestructor A.endl;private:int x;class B:public virtual Aprivate:int y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c) coutB constructor.yendl;int f()A:f();Aobj.f();return +y;void display()coutA:f()tAobj.f()tf()endl;B()coutdestructor B.endl; ;class C:public Bpublic:C(int a,int b,int c):B(a,b,c),A(0) coutC constructor.endl;class D:public C,public virtual Apublic:D(int a,int b,int c):C(a,b,c),A(c) coutD constructor.endl;D()coutdestructor D.endl;int main()D d(7,8,9);d.f();d.display();return 0;(3)程序运行结果:A constructor.9A constructor.9B constructor.9C constructor.D constructor.12 12 11destructor D.destructor B.destructor A.destructor A.(4)#include using namespace std;class Base1public:Base1()coutclass Base1!endl;class Base2public:Base2()coutclass Base2!endl;class Level1:public Base2,virtual public Base1public:Level1()coutclass Level1!endl;class Level2: public Base2,virtual public Base1public:Level2()coutclass Level2!endl;class TopLevel:public Level1,virtual public Level2public:TopLevel()coutclass TopLevel!endl;int main()TopLevel obj;return 0;(4)程序运行结果:class Base1!class Base12class Leve12!class Base2!class Leve11!class TopLeve1!2某出版系统发行图书和磁带,利用继承设计管理出版物的类。要求如下:建立一个基类Publication存储出版物的标题title、出版物名称name、单价price及出版日期date。用Book类和Tape类分别管理图书和磁带,它们都从Publication类派生。Book类具有保存图书页数的数据成员page,Tape类具有保存播放时间的数据成员playtime。每个类都有构造函数、析构函数,且都有用于从键盘获取数据的成员函数inputData(),用于显示数据的成员函数display()。2、#include using namespace std;#include class Datepublic:Date()Date(int y,int m,int d);Date(Date &d);void SetDate(int y,int m,int d);void ShowDate();private: int year,month,day;Date:Date(int y,int m,int d)year=y;month=m;day=d; Date:Date(Date &d)year=d.year;month=d.month;day=d.day; void Date:SetDate(int y,int m,int d)year=y;month=m;day=d; void Date:ShowDate()coutyear年month月day日endl; class Timepublic:Time()Time(int h,int m,int s);Time(Time &t);void SetTime(int h,int m,int s);void ShowTime();private: int hour,minute,second;Time:Time(int h,int m,int s)hour=h;minute=m;second=s; Time:Time(Time &t) hour=t.hour;minute=t.minute;second=t.second; void Time:SetTime(int h,int m,int s) hour=h;minute=m;second=s; void Time:ShowTime()couthour:minute:secondendl; class Publicationpublic: Publication()Publication(string title,string name,float price,int y,int m,int d);void inputData();void display();private:string title;string name;float price;Date date;Publication:Publication(string title,string name,float price,int y,int m,int d):title(title),name(name),price(price),date(y,m,d)void Publication:inputData()coutPlease input title, name, price, publication date of a book:titlenameprice;int year,month,day;cinyearmonthday;date.SetDate(year,month,day);void Publication:display()couttitle=titleendl;coutname=nameendl;coutprice=priceendl;coutpage=page;void Book:inputData()Publication:inputData();coutPlease the pages of the book:page;void Book:display()Publication:display();coutpage=pageendl;class Tape:public Publicationpublic:Tape()Tape(string title,string name,float price,int y,int m,int d,Time playtime);void inputData();void display();private:Time playtime;Tape:Tape(string title,string name,float price,int y,int m,int d,Time playtime):Publication(title,name,price,y,m,d),playtime(playtime)void Tape:inputData()Publication:inputData();coutPlease the playtime of the tape:hourminutesecond;playtime.SetTime(hour,minute,second);void Tape:display()Publication:display();coutplaytime=;playtime.ShowTime();int main()Book book1(教材,C+程序设计,30.00,2009,6,1,300);book1.display();coutendl;Time time1(30,10,20); Tape tape1(磁带,C+程序设计视频,10.00,2009,8,1,time1);tape1.display();Book book2;book2.inputData();book2.display();coutendl;Tape tape2;tape2.inputData();tape2.display();return 0;3分别定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)。要求:(1)在两个基类中都包含姓名、年龄、性别、地址、电话数据成员。(2)在Teacher类中还包含数据成员职称title,在Cadre类中还包含数据成员职务post,在Teacher_Cadre类中还包含数据成员工资wage。(3)对两个基类中的姓名、年龄、性别、地址、电话数据成员用相同的名字,在访问这类数据成员时,指定作用域。(4)在类体中声明成员函数,在类外定义成员函数。(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、地址、电话,然后再用cout语句输出职务和工资。3、#include#include using namespace std;class Teacher public: Teacher(string nam,int a,char s,string tit,string ad,string t); void display(); protected: string name; int age; char sex; string title; string addr; string tel;Teacher:Teacher(string nam,int a,char s,string tit,string ad,string t): name(nam),age(a),sex(s),title(tit),addr(ad),tel(t) void Teacher:display() coutname:nameendl; coutageageendl; coutsex:sexendl; couttitle:titleendl; coutaddress:addrendl; couttel:telendl; class Cadre public: Cadre(string nam,int a,char s,string p,string ad,string t); void display(); protected: string name; int age; char sex; string post; string addr; string tel; ; Cadre:Cadre(string nam,int a,char s,string p,string ad,string t): name(nam),age(a),sex(s),post(p),addr(ad),tel(t)void Cadre:display() coutname:nameendl; coutage:ageendl; coutsex:sexendl; coutpost:postendl; coutaddress:addrendl; couttel:telendl;class Teacher_Cadre:public Teacher,public Cadre public: Teacher_Cadre(string nam,int a,char s,string tit,string p,string ad,string t,float w); void show( ); private: float wage; ; Teacher_Cadre:Teacher_Cadre(string nam,int a,char s,string t,string p,string ad,string tel,float w): Teacher(nam,a,s,t,ad,tel),Cadre(nam,a,s,p,ad,tel),wage(w) void Teacher_Cadre:show( ) Teacher:display(); coutpost:Cadre:postendl; coutwages:wageendl;int main( ) Teacher_Cadre te_ca(Wang-li,50,f,prof.,president,135 Beijing Road,Shanghai,(021)61234567,1534.5); te_ca.show( ); return 0;4按下列要求编写程序。(1)定义一个分数类Score。它有3个数据成员:Chinese /语文课成绩English /英语课成绩Mathematics /数学课成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算三门课总成绩print() /输出三门课成绩和总成绩modify() /修改三门课成绩(2)定义一个学生类Student。它有3个数据成员:Num /学号Name /姓名MyScore /成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算某学生三门课总成绩print() /输出某学生学号、姓名和成绩modify() /修改某学生学号、姓名和成绩(3)在主函数中,先定义一个学生类对象数组,再通过for循环给对象数组赋上实际值,最后输出对象数组个元素的值。4、#include#includeusing namespace std;class scorepublic:score()chinese=0;english=0;mathematics=0;score(float ch,float en,float ma):chinese(ch),english(en),mathematics(ma)float sum(); void print(); void modify(); private:float chinese;float english;float mathematics;class studentpublic:student():myscore(0,0,0)num=000000000;name=无;student(string n,string na,float m,float c,float e):num(n),name(na),myscore(m,c,e)float sum(); void print(); void modify(); private:string num; string name; score myscore; ;float score:sum()return(chinese+english+mathematics);void score:print()cout语文chineseendl;cout英语englishendl;cout数学mathematicsendl;cout总成绩sum()endl;coutendlendlendl;void score:modify()cout请输入三门成绩chinese;cinenglish;cinmathematics;coutendlendlendl;float student:sum()return(myscore.sum();void student:print()cout学号:numendl;cout姓名:nameendl;myscore.print();void student:modify()cout请输入学号,姓名和成绩:num;cinname; myscore.modify();int main()student st3; cout请输入学生信息:endl;for(int i=0;i3;i+)sti.modify();for(int i=0;i3;i+)sti.print();return 0;5编写一个程序实现小型公司的人员信息管理系统。该公司雇员(employee)包括经理(manager),技术人员(technician)、销售员(salesman)和销售部经理(salesmanager)。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪并显示全部信息。程序要对所有人员有提升级别的功能。为简单起见,所有人员的初始级别均为1,然后进行升级,经理升为4级,技术人员和销售部经理升为3级,销售员仍为1级。月薪计算办法是:经理拿固定月薪8000元,技术人员按每小时100元领取月薪,销售员按该当月销售额4%提成,销售经理既拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售额的5。#include#includeusing namespace std;class employee /虚基类public:employee()coutID;coutname;salary=0; /月薪virtual void pay()=0; /月薪计算函数virtual void show()=0;protected:string name; /姓名int ID; /职工编号double salary; /月薪;class technician:virtual public employeepublic:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论