1、C实验三继承和派生类附答案解析实验三 继承和派生类实验目的和要求 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 ch
2、ari; 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
3、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
4、.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 dis
5、play() 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
6、.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
7、; ;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
8、 b; void show() coutA:a=aendl; /语句9public: int b;void main() B bb; /语句1 bb.seta(6); /语句2 bb.setb(3); /语句3 bb.show(); /语句4 coutA:a=bb.aendl; /语句5 coutB:b=bb.bendl; /语句6 coutA:a=bb.geta()endl; /语句7 coutB:b=bb.getb()endl; /语句8按下列要求对程序进行修改,然后调试,对出现的错误分析其原因。(1)将派生类B的继承方式改为private时,会出现哪些错误和不正常现象?为什么?(2)将派
9、生类B的继承方式改为protected时,会出现哪些错误和不正常现象?为什么?(3)将派生类B的继承方式恢复为public后,再将类A中数据成员a的访问权限改为private时,会出现哪些错误和不正常现象?为什么?(4)派生类B的继承方式仍为public,将类A中数据成员a的访问权限改为protected时,会出现哪些错误和不正常现象?为什么? 3.定义一个类MyArray,类中可以存放一组整数。类的定义如下: class MyArray public: MyArray(int len); /初始化,动态申请存储空间 MyArray(); /对象结束时,释放所占用的存储空间 void Inpu
10、t(); /输入数据 void Display(); /显示数据 protected: int *alist; /指向动态申请的一组空间 int length; /整数的个数 ; 基类中有构造函数、析构函数、输入数据和输出数据的函数。 (1)实现该类并设计主函数对所定义的类进行调试。下同。(2)由MyArray派生一个类SortArray,在该类中定义函数实现排序功能。(3)由MyArray派生一个类ReArray,在该类中定义函数实现数据前后逆转功能。(4)由MyArray派生一个类AverArray,在该类中定义函数Aver求解类中所有数据的平均值。(5)定义NewArray类,同时继承了
11、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出
12、现错误。因为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
13、); 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; /整数的个数p
14、ublic: 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
15、; ;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(); couten
16、dl现在将数组内成员进行从小到大排序: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
17、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=ali
18、stj; 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() /对象
19、结束时,释放所占用的存储空间 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; fl
20、oat 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(i
21、nt 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 SortA
22、rray: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: ReAr
23、ray(int n):Myarray(n) coutReArray 初始化.endl; void get_ReArray() int i,t,j=length-1; for(i=0;ilength/2;i+,j-) t=alisti; alisti=alistj; alistj=t; ;class AverArray:virtual public Myarray /求平均值public: AverArray(int n):Myarray(n) coutAverArray 初始化.endl; float get_AverArray() float aver; int sum=0,i; for(i=0;ilength;i+) sum+=alisti; aver=(float)sum/length; return aver; ;class NewArray:public SortArray,public ReArray,public AverArraypublic: NewArray(int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1