实验三继承和派生类实验目的和要求1.理解类的继承的概念,能够定义和使用类的继承关系。
2.掌握派生类的声明与定义方法。
3.熟悉公有派生和私有派生的访问特性。
4.学习虚基类在解决二义性问题中的作用。
实验内容1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)#include<>class A{public:A(){cout<<"A::A() called.\n";}~A(){cout<<"A::~A() called.\n";}};class B:public A{public:B(int i){cout<<"B::B() called.\n";buf=new char[i];}~B(){delete []buf;cout<<"B:~B() called.\n";}private:c har *buf;};void main(){B b(10);}(2)#include<>class A{public:A(int a,int b):x(a),y(b){cout<<"A constructor..."<<endl;}v oid Add(int a,int b){x+=a;y+=b;}v oid display(){cout<<"("<<x<<","<<y<<")"<<endl;}~A(){cout<<"destructor A..."<<endl;}private:i nt x,y;};class B:private A{private:i nt i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d),Aobj(1,1) {cout<<"B constructor..."<<endl;}v oid Add(int x1,int y1,int x2,int y2){A::Add(x1,y1);i+=x2;j+=y2;}v oid display()A::display();();cout<<"("<<i<<","<<j<<")"<<endl; }~B(){cout<<"destructor B..."<<endl;}};void main(){B b(1,2,3,4);();(1,3,5,7);();}(3)#include<>class A{public:A(int a):x(a){cout<<"A constructor..."<<x<<endl; }i nt f(){return ++x;}~A(){cout<<"destructor A..."<<endl;}private:i nt x;};class B:public virtual A{private:i nt y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c)cout<<"B constructor..."<<y<<endl;}i nt f(){A::f();();return ++y;}v oid display(){cout<<A::f()<<'\t'<<()<<'\t'<<f()<<endl; }~B(){cout<<"destructor B..."<<endl;}};class C:public B{public:C(int a,int b,int c):B(a,b,c),A(0){cout<<"C constructor..."<<endl;}};class D:public C,virtual public A{public:D(int a,int b,int c):C(a,b,c),A(c){cout<<"D constructor..."<<endl;}~D(){cout<<"destructor D..."<<endl;}};void main(){D d(7,8,9);();();}(4)#include<>class Base1{public:B ase1(){cout<<"class Base1!"<<endl;}};class Base2{public:B ase2(){cout<<"class Base2!"<<endl;}};class Level1:public Base2,virtual public Base1{public:L evel1(){cout<<"class Level1!"<<endl;}};class Level2:public Base2,virtual public Base1{public:L evel2(){cout<<"class Level2!"<<endl;}};class TopLevel:public Level1,virtual public Level2 {public:T opLevel(){cout<<"class TopLevel!"<<endl;}};void main(){T opLevel obj;}2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。
#include <>class A{public:v oid seta(int i){a=i; }i nt geta(){return a; }public:i nt a;};class B:public A{public:v oid setb(int i){b=i; }i nt getb(){return b; }v oid show(){cout<<"A::a="<<a<<endl; } 义一个类MyArray,类中可以存放一组整数。
类的定义如下:class MyArray{public:MyArray(int len); 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 Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void sort(){int i,j,k,temp;for(i=0;i<length-1;i++){k=i;for(j=i+1;j<length;j++)if(alist[j]<alist[k]){k=j;}temp=alist[i];alist[i]=alist[k];alist[k]=temp;}}};void main(){SortArray B(4);();();cout<<endl<<"现在将数组内成员进行从小到大排序:"<<endl;();();}(3)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void turn(){int i,t,j=length-1;for(i=0;i<length/2;i++,j--){t=alist[i];alist[i]=alist[j];alist[j]=t;}}};void main(){ReArray B(4);();();cout<<endl<<"现在将数组内成员进行前后逆转:"<<endl;();();}(4)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}float getaver(){float aver;int sum=0,i;for(i=0;i<length;i++)sum+=alist[i];aver=(float)sum/length;return aver;}};void main(){AverArray B(3);();();cout<<endl<<"数组内成员的平均值为:";cout<<()<<' '<<endl;}(5)#include <>class Myarray{protected:int *alist; ."<<endl;}~Myarray() ."<<endl;}void get_SortArray(){int i,j,k,temp;for(i=0;i<length-1;i++){k=i;for(j=i+1;j<length;j++)if(alist[j]<alist[k]){k=j;}temp=alist[i];alist[i]=alist[k];alist[k]=temp;}}};class ReArray: virtual public Myarray ."<<endl;}void get_ReArray(){int i,t,j=length-1;for(i=0;i<length/2;i++,j--){t=alist[i];alist[i]=alist[j];alist[j]=t;}}};class AverArray:virtual public Myarray ."<<endl;}float get_AverArray(){float aver;int sum=0,i;for(i=0;i<length;i++)sum+=alist[i];aver=(float)sum/length;return aver;}};class NewArray:public SortArray,public ReArray,public AverArray{public:NewArray(int n):SortArray(n),ReArray(n),AverArray(n),Myarray(n) {cout<<"NewArray 初始化..."<<endl;}void fun(){cout<<endl<<"数组成员的平均值为:";cout<<AverArray::get_AverArray()<<' '<<endl;cout<<endl<<"现在将数组成员进行前后逆转:"<<endl;ReArray::get_ReArray();Myarray::Display();cout<<endl<<"现在将数组成员进行从小到大排序:"<<endl;SortArray::get_SortArray();Myarray::Display();}};void main(){NewArray B(3);();();();}。