C++ 实验三 继承和派生类 (附答案)_第1页
C++ 实验三 继承和派生类 (附答案)_第2页
C++ 实验三 继承和派生类 (附答案)_第3页
C++ 实验三 继承和派生类 (附答案)_第4页
C++ 实验三 继承和派生类 (附答案)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

实验三 继承和派生类实验目的和要求 1理解类的继承的概念,能够定义和使用类的继承关系。 2掌握派生类的声明与定义方法。 3熟悉公有派生和私有派生的访问特性。 4学习虚基类在解决二义性问题中的作用。实验内容1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。(1)#includeclass Apublic:A()coutA:A() called.n;A()coutA:A() called.n;class B:public Apublic:B(int i)coutB:B() called.n;buf=new chari;B()delete buf;coutB:B() called.n;private:char *buf;void main()B b(10);(2)#includeclass 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)endl;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;void main()B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display();(3)#includeclass 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,virtual public Apublic:D(int a,int b,int c):C(a,b,c),A(c)coutD constructor.endl;D()coutdestructor D.endl;void main()D d(7,8,9);d.f();d.display();(4)#includeclass 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;void main()TopLevel obj;2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。#include class Apublic:void seta(int i)a=i;int geta()return a;public:int a;class B:public Apublic:void setb(int i)b=i;int getb()return b;void show()coutA:a=aendl; /语句9public:int b;void main()B bb;/语句1bb.seta(6);/语句2bb.setb(3);/语句3bb.show();/语句4coutA:a=bb.aendl;/语句5coutB:b=bb.bendl;/语句6coutA:a=bb.geta()endl;/语句7coutB:b=bb.getb()endl;/语句8按下列要求对程序进行修改,然后调试,对出现的错误分析其原因。(1)将派生类B的继承方式改为private时,会出现哪些错误和不正常现象?为什么?(2)将派生类B的继承方式改为protected时,会出现哪些错误和不正常现象?为什么?(3)将派生类B的继承方式恢复为public后,再将类A中数据成员a的访问权限改为private时,会出现哪些错误和不正常现象?为什么?(4)派生类B的继承方式仍为public,将类A中数据成员a的访问权限改为protected时,会出现哪些错误和不正常现象?为什么? 3.定义一个类MyArray,类中可以存放一组整数。类的定义如下: class MyArray public: MyArray(int len);/初始化,动态申请存储空间 MyArray();/对象结束时,释放所占用的存储空间 void Input();/输入数据 void Display();/显示数据 protected: int *alist; /指向动态申请的一组空间 int length; /整数的个数 ; 基类中有构造函数、析构函数、输入数据和输出数据的函数。(1)实现该类并设计主函数对所定义的类进行调试。下同。(2)由MyArray派生一个类SortArray,在该类中定义函数实现排序功能。(3)由MyArray派生一个类ReArray,在该类中定义函数实现数据前后逆转功能。(4)由MyArray派生一个类AverArray,在该类中定义函数Aver求解类中所有数据的平均值。(5)定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。参考答案(非权威,仅仅是我自己的理解,如有错误,欢迎批评指正!)1.(1)1.(2)1.(3)1.(4)2.(1)主函数中语句2、语句5、语句7出现错误。因为B采用私有继承,所以A中的公有函数在B中是变为私有函数,主函数中不能访问B中的私有函数。(2)主函数中语句2、语句5、语句7出现错误。因为B采用保护继承,所以A中的公有函数在B中是变为保护函数,主函数中不能访问B中的保护函数。(3)主函数中语句9、语句5出现错误。因为B采用公有继承,所以B中和主函数中不能访问A中的私有函数。(4)主函数中语句5出现错误。因为B采用公有继承,所以A中保护成员在B中仍为保护成员,B中可以访问A中的保护成员,但不能通过类的对象访问类的保护成员。3.(1)#include class Myarrayprotected:int *alist; /指向动态申请的一组空间int length;/整数的个数public: Myarray(int len)/初始化,动态申请存储空间 alist=new intlen;length=len; Myarray()/对象结束时,释放所占用的存储空间 delete(alist);coutendl再见!endl; void Input()/输入数据 int i; for(i=0;ilength;i+) cout输入数组的第i+1alisti; void Display()/显示数据 coutn数组的成员为:n;for(int i=0;ilength;i+) coutalisti ;coutendl; ;void main()Myarray A(3);A.Input();A.Display();(2)#include class Myarrayprotected:int *alist; /指向动态申请的一组空间int length;/整数的个数public: Myarray(int len)/初始化,动态申请存储空间 alist=new intlen;length=len;coutMyarray 初始化.endl; Myarray()/对象结束时,释放所占用的存储空间 delete(alist);coutendl再见!endl; void Input()/输入数据 int i; for(i=0;ilength;i+) cout输入数组的第i+1alisti; void Display()/显示数据 coutn本数组成员依次为:n;for(int i=0;ilength;i+) coutalisti ;coutendl; ;class SortArray:virtual public Myarraypublic: SortArray(int n):Myarray(n) coutSortArray 初始化.endl;void sort() int i,j,k,temp; for(i=0;ilength-1;i+) k=i;for(j=i+1;jlength;j+) if(alistjalistk) k=j; temp=alisti; alisti=alistk; alistk=temp; ;void main()SortArray B(4);B.Input();B.Display();coutendl现在将数组内成员进行从小到大排序:endl;B.sort();B.Display();(3)#include class Myarrayprotected:int *alist; /指向动态申请的一组空间int length;/整数的个数public: Myarray(int len)/初始化,动态申请存储空间 alist=new intlen;length=len;coutMyarray 初始化.endl; Myarray()/对象结束时,释放所占用的存储空间 delete(alist);coutendl再见!endl; void Input()/输入数据 int i; for(i=0;ilength;i+) cout输入数组的第i+1alisti; void Display()/显示数据 coutn本数组成员依次为:n;for(int i=0;ilength;i+) coutalisti ;coutendl; ;class ReArray: virtual public Myarraypublic: ReArray(int n):Myarray(n) coutReArray 初始化.endl; void turn()int i,t,j=length-1;for(i=0;ilength/2;i+,j-)t=alisti;alisti=alistj;alistj=t;void main()ReArray B(4);B.Input();B.Display();coutendl现在将数组内成员进行前后逆转:endl;B.turn();B.Display();(4)#include class Myarrayprotected:int *alist; /指向动态申请的一组空间int length;/整数的个数public: Myarray(int len)/初始化,动态申请存储空间 alist=new intlen;length=len;coutMyarray 初始化.endl; Myarray()/对象结束时,释放所占用的存储空间 delete(alist);coutendl再见!endl; void Input()/输入数据 int i; for(i=0;ilength;i+) cout输入数组的第i+1alisti; void Display()/显示数据 coutn本数组成员依次为:n;for(int i=0;ilength;i+) coutalisti ;coutendl; ;class AverArray:virtual public Myarraypublic:AverArray(int n):Myarray(n) coutAverArray 初始化.endl; float getaver() float aver; int sum=0,i; for(i=0;ilength;i+) sum+=alisti; aver=(float)sum/length; return aver; ;void main()AverArray B(3);B.Input();B.Display();coutendl数组内成员的平均值为:;coutB.getaver() endl;(5)#include class Myarrayprotected:int *alist; /指向动态申请的一组空间int length;/整数的个数public: Myarray(int len)/初始化,动态申请存储空间 alist=new intlen;length=len;coutMyarray 初始化.endl; Myarray()/对象结束时,释放所占用的存储空间 delete(alist);coutendl再见!endl; void Input()/输入数据 int i; for(i=0;ilength;i+) cout输入数组的第i+1alisti; void Display()/显示数据 coutendl本数组成员依次为:;for(int i=0;ilength;i+) coutalisti ;coutendl; ;class SortArray:virtual public Myarray/从小到大排序public: SortArray(int n):Myarray(n) coutSortArray 初始化.endl;void get_SortArray() int i,j,k,temp; for(i=0;ilength-1;i+) k=i;for(j=i+1;jlength;j+) if(alistjalistk) k=j; temp=alisti; alisti=alistk; alistk=temp; ;class ReArray: virtual public Myarray/前后逆转public: ReArray(int n):Myarray(n) coutReArray 初始化.endl; void get_ReArray(

温馨提示

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

评论

0/150

提交评论