C语言程序设计实验答案继承与派生.doc_第1页
C语言程序设计实验答案继承与派生.doc_第2页
C语言程序设计实验答案继承与派生.doc_第3页
C语言程序设计实验答案继承与派生.doc_第4页
C语言程序设计实验答案继承与派生.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

.实验 07 继承与派生( 4 学时)(第 7 章 继承与派生)一、实验目的(1) 学习声明和使用类的继承关系,声明派生类。(2) 熟悉不同继承方式下对基类成员的访问控制。(3) 学习利用虚基类解决二义性问题。二、实验任务7_1 声明一个基类 Animal。有私有整型成员变量 age,构造其派生类 dog,在其成员函数 SetAge(int n)中直接给 age赋值,看看会有什么问题,把 age 改为公有成员变量,还会有问题吗?编程试试看。7_2 声明一个基类 BaseClas。s有整型成员变量 Number ,构造其派生类 DerivedClass,观察构造函数和析构函数的执行情况。7_3 声明一个车 (vehicle)基类。具有 MaxSpeed、Weight 等成员变量,Run、Stop等成员函数, 由此派生出自行车 (bicycle)类、汽车 (motorcar) 类。自行车 (bicycle)类有高度 (Height) 等属性,汽车 (motorcar) 类有座位数(SeatNum) 等属性。从 bicycle和 motorcar 派生出摩托车 (motorcycle)类,在继承过程中,注意把 vehicle 设置为虚基类。 如果不把 vehicle 设置为虚基类, 会有什么问题?编程试试看。7_4 以实验 6 中的 People(人员)类为基类。派生出 student(学生)类,添加属性:班号 char classNo7;派生出 teacher(教师)类,添加属性:职务 char principalship11 、部门 chardepartment21 。从 student 类中派生出 graduate(研究生)类,添加属性:专业 char subject21、导师teacher adviser;从 graduate 类和 teacher 类派生出 TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。类之间的关系如图 7-1 所示。1.人员 日期姓名 年编号 月性别 日出生日期 函数身份证号函数学生 教师班号 职务 部门函数函数研究生专业导师函数助教博士生图 7-1 类图三、实验步骤1. (编程)声明基类 Animal,成员变量 age声明为私有的。构造派生类 dog,在其成员函数 SetAge(int n)中直接对 age 赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word 文件中,不会出现汉字的乱码)用 private 时的结果:1- 已启动生成 : 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:10:35 。1InitializeBuildStatus:1 正在创建“ Debugcpp.unsuccessfulbuild ”,因为已指定“ AlwaysCreate ”。1ClCompile:1 main.cpp1f:projectscppcppmain.cpp(13): error C2248: “Animal:age ”: 无法访问 private成员 ( 在“Animal ”类中声明 )1 f:projectscppcppmain.cpp(8) : 参见“ Animal:age ”的声明1 f:projectscppcppmain.cpp(5) : 参见“ Animal ”的声明21f:projectscppcppmain.cpp(14): error C2248: “Animal:age ”: 无法访问 private成员 ( 在“Animal ”类中声明 )1 f:projectscppcppmain.cpp(8) : 参见“ Animal:age ”的声明1 f:projectscppcppmain.cpp(5) : 参见“ Animal ”的声明11生成失败。11已用时间 00:00:03.28= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =把 age改为公有变量后重新编译就可以了。程序名: lab7_1.cpp。 程序及运行结果:/lab7_1.cpp#include using namespace std;class Animalprivate : /private 时出错/public:/public 和 protected 正确int age;class dog: public Animalpublic :void SetAge( int n) age=n; int GetAge() return age; ;void main() dog d; d.SetAge(3); cout Age= d.GetAge()- 已启动生成 : 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:10:35 。1InitializeBuildStatus:1 正在创建“ Debugcpp.unsuccessfulbuild ”,因为已指定“ AlwaysCreate ”。1ClCompile:1 main.cpp1f:projectscppcppmain.cpp(13): error C2248: “Animal:age ”: 无法访问 private成员 ( 在“Animal ”类中声明 )1 f:projectscppcppmain.cpp(8) : 参见“ Animal:age ”的声明1 f:projectscppcppmain.cpp(5) : 参见“ Animal ”的声明1f:projectscppcppmain.cpp(14): error C2248: “Animal:age ”: 无法访问 private成员 ( 在“Animal ”类中声明 )1 f:projectscppcppmain.cpp(8) : 参见“ Animal:age ”的声明31 f:projectscppcppmain.cpp(5) : 参见“ Animal ”的声明11生成失败。11已用时间 00:00:03.28= 生成 : 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =用 public 时的结果:2. (编程)声明一个基类 BaseClass,构造其派生类 DerivedClass。在构造函数和析构函数中用 cout 输出提示信息, 观察构造函数和析构函数的执行情况。程序名: lab7_2.cpp。参考的运行结果: 程序及运行结果:/lab7_2.cpp#include using namespace std;class BaseClasspublic :BaseClass() cout 构造了一个 BaseClass 类的对象 .endl; BaseClass() cout 析构了一个 BaseClass 类的对象 . endl; private :int Number;class DeriveClass: public BaseClasspublic :DeriveClass() cout 构造了一个 DeriveClass 类的对象 . endl; DeriveClass() cout 析构了一个 DeriveClass 类的对象 . endl; ;void main() DeriveClass a; 42. (操作)用调试功能跟踪程序 lab7_2 的执行过程。观察基类和派生类的构造函数和析构函数的执行情况。3. (编程)声明一个车 (vehicle)虚基类。由此派生出自行车 (bicycle)类、汽车 (motorcar) 类,注意把 vehicle派生为虚基类。再从bicycle 和 motorcar 派生出摩托车 (motorcycle)类,在 main()函数中测试这个类。程序名:lab7_3.cpp。参考的运行结果: 程序及运行结果:/lab7_3.cpp#include using namespace std;class vehicle / 车类,作为基类protected :int MaxSpeed,Weight; / 最大速度,重量public:void Run() cout 车 vehicle 类开始运行 ! endl; void Stop() cout 车 vehicle 类停止运行 ! endl; ;class bicycle: virtual public vehicle / 自行车类:公有继承虚基类 vehicleprotected :int Height; / 高度;class motorcar: virtual public vehicle / 汽车类:公有继承虚基类 vehicleprotected :int SeatNum; / 座位数;5class motorcycle:public bicycle, public motorcar / 摩托车类:公有继承自行车类和汽车类public:void Setdata( int ms, int wt, int ht, int sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=sn; ;void Show()cout 最大速度: MaxSpeed 重量: Weight 高度: Height 座位数: SeatNumendl;void main()cout int 类型占用字节数 : sizeof ( int )endl;cout vehicle 占用字节数 : sizeof (vehicle)endl;cout bicycle 占用字节数 : sizeof (bicycle)endl;cout motorcar 占用字节数 : sizeof (motorcar)endl;cout motorcycle 占用字节数 : sizeof (motorcycle)- 已启动生成 : 项目: cpp, 配置: Debug Win32 -1生成启动时间为 2013-2-18 11:23:32 。1InitializeBuildStatus:1 正在创建“ Debugcpp.unsuccessfulbuild ”,因为已指定“ AlwaysCreate ”。1ClCompile:1 main.cpp1f:projectscppcppmain.cpp(27): error C2385: 对“ MaxSpeed”的访问不明确1 可能是“ MaxSpeed”( 位于基“ vehicle ”中)1 也可能是“ MaxSpeed”(位于基“ vehicle ”中)1f:projectscppcppmain.cpp(27): error C2385: 对“ Weight ”的访问不明确1 可能是“ Weight ”( 位于基“ vehicle ”中)1 也可能是“ Weight ”( 位于基“ vehicle ”中)1f:projectscppcppmain.cpp(29): error C2385: 对“ MaxSpeed”的访问不明确1 可能是“ MaxSpeed”( 位于基“ vehicle ”中)1 也可能是“ MaxSpeed”(位于基“ vehicle ”中)1f:projectscppcppmain.cpp(30): error C2385: 对“ Weight ”的访问不明确1 可能是“ Weight ”( 位于基“ vehicle ”中)1 也可能是“ Weight ”( 位于基“ vehicle ”中)1f:projectscppcppmain.cpp(42): error C2385: 对“ Run”的访问不明确1 可能是“ Run”( 位于基“ vehicle ”中)1 也可能是“ Run”( 位于基“ vehicle ”中)1f:projectscppcppmain.cpp(42): error C3861: “Run”: 找不到标识符1f:projectscppcppmain.cpp(45): error C2385: 对“ Stop”的访问不明确1 可能是“ Stop”( 位于基“ vehicle ”中 )1 也可能是“ Stop”( 位于基“ vehicle ”中)1f:projectscppcppmain.cpp(45): error C3861: “Stop ”: 找不到标识符11生成失败。11已用时间 00:00:01.07= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =(2) 指明继承路径(程序及运行结果)将 vehicle 中数据成员和函数成员指明路径。/lab7_3.cpp#include using namespace std;class vehicle / 车类,作为基类protected :7int MaxSpeed,Weight; / 最大速度,重量public :void Run() cout 车 vehicle 类开始运行 ! endl; void Stop() cout 车 vehicle 类停止运行 ! endl; ;class bicycle: public vehicle / 自行车类:公有继承虚基类 vehicleprotected :int Height; / 高度;class motorcar: public vehicle / 汽车类:公有继承虚基类 vehicleprotected :int SeatNum; / 座位数;class motorcycle:public bicycle, public motorcar / 摩托车类:公有继承自行车类和汽车类public :void Setdatabicycle( int ms, int wt, int ht, int sn)bicycle:MaxSpeed=ms; bicycle:Weight=wt; / 修改,指明路径Height=ht; SeatNum=sn;void Showbicycle()cout 最大速度: bicycle:MaxSpeed 重量: bicycle:Weight 高度:Height 座位数: SeatNumendl; / 修改, 指明路径;void main()cout int 类型占用字节数 : sizeof ( int )endl;cout vehicle 占用字节数 : sizeof (vehicle)endl;cout bicycle 占用字节数 : sizeof (bicycle)endl;cout motorcar 占用字节数 : sizeof (motorcar)endl;cout motorcycle 占用字节数 : sizeof (motorcycle)endl;motorcycle mt;mt.bicycle:Run(); / 修改,指明路径mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop(); / 修改,指明路径84. 以实验 6 中的 people(人员)类为基类,派生相应的类。按任务 7_4 的要求编写程序,并运行。参考的运行结果: 程序及运行结果:(1) lab6_7.h:People(人员)类的声明及成员函数的实现/lab6_7.h#include #include using namespace std;9class Dateprivate :int yy,mm,dd;public :Date() Date(Date &d) : yy(d.yy),mm(d.mm),dd(d.dd) / 增添Date() int Getyy() const return yy; int Getmm() const return mm; int Getdd()const return dd; void Setyy( int y) yy=y; void Setmm( int m) mm=m; void Setdd( int d) dd=d; ;class Peopleprivate :char name11; / 姓名,增添char number7; / 编号,改为数组char sex3; / 男或女,改为数组Date birthday; / 出生日期char id16; / 身份证号,改为数组public :People()People(People &p);People()void Getname( char na) strcpy(na,name); void Getnumber( char nu) strcpy(nu,number); void Getsex( char se)strcpy(se,sex); int Getbirthyy() const return birthday.Getyy(); int Getbirthmm() const return birthday.Getmm(); int Getbirthdd() const return birthday.Getdd(); void Getid( char d) strcpy(d,id); void Setname( char na) strcpy(name,na); void Setnumber( char nu) strcpy(number ,nu); void Setsex( char se)strcpy(sex,se); void Setbirthyy( int y) birthday.Setyy(y); void Setbirthmm( int m) birthday.Setmm(m); void Setbirthdd( int d) birthday.Setdd(d); void Setid( char d) strcpy(id,d); 10void input();void output();People:People(People &p):birthday(p.birthday)strcpy(name,);strcpy(number ,p.number);strcpy(sex,p.sex);strcpy(id,p.id);inline void People:input()coutname;coutnumber;coutsex;coutymd;Setbirthyy(y); Setbirthmm(m); Setbirthdd(d);coutid;inline void People:output()cout 姓名: name n 编号: numberendl;cout 性别: sexendl;cout 出生日期: Getbirthyy() 年Getbirthmm() 月Getbirthdd() 日 endl;cout 身份证号: idendl;(2) lab7_4.h:People类的派生类/lab7_4.h#include lab6_7.hclass student: virtual public People / 学生类private :char classNo7; / 班号public :student()student(student &st):People(st) strcpy(classNo,st.classNo); / 使用类型兼容规则student()void GetclassNo( char cNo) strcpy(cNo,classNo); 11void SetclassNo( char *c) strcpy(classNo,c); void input() People:input(); coutclassNo; void output() People:output(); cout 班号: classNoendl; ;class teacher: virtual public People / 教师类private :char principalship11; / 职务char department21; / 部门public :teacher()teacher(teacher &t):People(t)strcpy(principalship,t.principalship);strcpy(department,t.department);teacher()void Getprincipalship( char *pri) strcpy(pri,principalship); void Getdepartment( char *dep) strcpy(dep,department); void Setprincipalship( char *pri) strcpy(principalship,pri); void Setdepartment( char *dep) strcpy(department,dep); void input() People:input();coutprincipalship;cout department;void output()People:output();cout 职务: principalshipendl;cout 部门: departmentendl;class graduate: public student / 研究生类private :char subject21; / 专业teacher adviser; / 导师public :graduate()graduate(graduate &g):student(g),adviser(g.adviser) strcpy(subject,g.subject); graduate()void GetSubject( char * sb) strcpy(sb,subject); void Getadviser(teacher &ad)12char na11; adviser .Getname(na); ad.Setname(na);char nb7; adviser .Getnumber(nb); ad.Setnumber(nb);char se3; adviser .Getsex(se); ad.Setsex(se);ad.Setbirthyy(adviser .Getbirthyy();ad.Setbirthmm(adviser .Getbirthmm();ad.Setbirthdd(adviser .Getbirthdd();char id016; adviser .Getid(id0); ad.Setid(id0);char pp11; adviser .Getprincipalship(pp); ad.Setprincipalship(pp);char dp21; adviser .Getdepartment(dp); ad.Setdepartment(dp);void SetSubject( char * sb) strcpy(subject,sb); void Seta

温馨提示

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

评论

0/150

提交评论