《C++ 实验三 继承和派生类 (附答案).doc》由会员分享,可在线阅读,更多相关《C++ 实验三 继承和派生类 (附答案).doc(19页珍藏版)》请在金锄头文库上搜索。
1、实验三 继承和派生类实验目的和要求 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:
2、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,
3、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 constr
4、uctor.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 Bpubl
5、ic: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:Bas
6、e2()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()TopLeve
7、l 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;
8、/语句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的访问权限改为pr
9、otected时,会出现哪些错误和不正常现象?为什么? 3.定义一个类MyArray,类中可以存放一组整数。类的定义如下: class MyArray public: MyArray(int len);/初始化,动态申请存储空间 MyArray();/对象结束时,释放所占用的存储空间 void Input();/输入数据 void Display();/显示数据 protected: int *alist; /指向动态申请的一组空间 int length; /整数的个数 ; 基类中有构造函数、析构函数、输入数据和输出数据的函数。(1)实现该类并设计主函数对所定义的类进行调试。下同。(2)由My
10、Array派生一个类SortArray,在该类中定义函数实现排序功能。(3)由MyArray派生一个类ReArray,在该类中定义函数实现数据前后逆转功能。(4)由MyArray派生一个类AverArray,在该类中定义函数Aver求解类中所有数据的平均值。(5)定义NewArray类,同时继承了SortArray, ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。参考答案(非权威,仅仅是我自己的理解,如有错误,欢迎批评指正!)1.(1)1.(2)1.(3)1.(4)2.(1)主
11、函数中语句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()/对象结束时,释放所占用的存储空间