C++ 实验三 继承和派生类 (附答案)

来源:互联网 发布:农村淘宝佣金怎么查 编辑:程序博客网 时间:2024/05/18 01:04

实验三  继承和派生类

实验目的和要求

    1.理解类的继承的概念,能够定义和使用类的继承关系。

    2.掌握派生类的声明与定义方法。

    3.熟悉公有派生和私有派生的访问特性。

    4.学习虚基类在解决二义性问题中的作用。

实验内容

1.先阅读下面的程序,分析程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。

(1)

#include<iostream.h>

class A

{

public:

      A()

      {

             cout<<"A::A()called.\n";

      }

      ~A()

      {

             cout<<"A::~A()called.\n";

      }

};

class B:public A

{

public:

      B(inti)

      {

             cout<<"B::B()called.\n";

             buf=newchar[i];

      }

      ~B()

      {

             delete[]buf;

             cout<<"B:~B()called.\n";

      }

private:

      char*buf;

};

void main()

{

      Bb(10);

}

(2)

#include<iostream.h>

class A

{

public:

      A(inta,int b):x(a),y(b)

      {

             cout<<"Aconstructor..."<<endl;

      }

      voidAdd(int a,int b)

      {

             x+=a;

             y+=b;

      }

      voiddisplay()

      {

             cout<<"("<<x<<","<<y<<")"<<endl;

      }

      ~A()

      {

             cout<<"destructorA..."<<endl;

      }

private:

      intx,y;

};

class B:private A

{

private:

      inti,j;

      AAobj;

public:

      B(inta,int b,int c,int d):A(a,b),i(c),j(d),Aobj(1,1)

      {

             cout<<"Bconstructor..."<<endl;

      }

      voidAdd(int x1,int y1,int x2,int y2)

      {

             A::Add(x1,y1);

             i+=x2;

             j+=y2;

      }

      voiddisplay()

      {

             A::display();

             Aobj.display();

             cout<<"("<<i<<","<<j<<")"<<endl;

      }

      ~B()

      {

             cout<<"destructorB..."<<endl;

      }

};

void main()

{

      Bb(1,2,3,4);

      b.display();

      b.Add(1,3,5,7);

      b.display();

}

(3)

#include<iostream.h>

class A

{

public:

      A(inta):x(a)

      {

             cout<<"Aconstructor..."<<x<<endl;

      }

      intf()

      {

             return++x;

      }

      ~A()

      {

             cout<<"destructorA..."<<endl;

      }

private:

      intx;

};

class B:public virtual A

{

private:

      inty;

      AAobj;

public:

      B(inta,int b,int c):A(a),y(c),Aobj(c)

      {

             cout<<"Bconstructor..."<<y<<endl;

      }

      intf()

      {

             A::f();

             Aobj.f();

             return++y;

      }

      voiddisplay()

      {

             cout<<A::f()<<'\t'<<Aobj.f()<<'\t'<<f()<<endl;

      }

      ~B()

      {

             cout<<"destructorB..."<<endl;

      }

};

class C:public B

{

public:

      C(inta,int b,int c):B(a,b,c),A(0)

      {

             cout<<"Cconstructor..."<<endl;

      }

};

class D:public C,virtual public A

{

public:

      D(inta,int b,int c):C(a,b,c),A(c)

      {

             cout<<"Dconstructor..."<<endl;

      }

      ~D()

      {

             cout<<"destructorD..."<<endl;

      }

};

void main()

{

      Dd(7,8,9);

      d.f();

      d.display();

}

(4)

#include<iostream.h>

class Base1

{

public:

      Base1()

      {

             cout<<"classBase1!"<<endl;

      }

};

class Base2

{

public:

      Base2()

      {

             cout<<"classBase2!"<<endl;

      }

};

class Level1:public Base2,virtual publicBase1

{

public:

      Level1()

      {

             cout<<"classLevel1!"<<endl;

      }

};

class Level2:public Base2,virtual publicBase1

{

public:

      Level2()

      {

             cout<<"classLevel2!"<<endl;

      }

};

class TopLevel:public Level1,virtual publicLevel2

{

public:

      TopLevel()

      {

             cout<<"classTopLevel!"<<endl;

      }

};

void main()

{

      TopLevelobj;

}

2.调试下列程序,并对程序进行修改后再调试,指出调试中的出错原因。

#include <iostream.h>

class A

{

public:

      voidseta(int i)

      {     a=i;  }

      intgeta()

      {     return a;  }

public:

      inta;

};

class B:public A

{

public:

      voidsetb(int i)

      {     b=i; }

      intgetb()

      {     return b;  }

      voidshow()

      {     cout<<"A::a="<<a<<endl;     } //语句9

public:

      intb;

};

void main()

{

      Bbb;                                                       //语句1

      bb.seta(6);                                                //语句2

      bb.setb(3);                                                //语句3

      bb.show();                                                //语句4

      cout<<"A::a="<<bb.a<<endl;                            //语句5

      cout<<"B::b="<<bb.b<<endl;                            //语句6

      cout<<"A::a="<<bb.geta()<<endl;               //语句7

      cout<<"B::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)主函数中语句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中的保护成员,但不能通过类的对象访问类的保护成员。第三题:(1)#include <iostream.h>class Myarray{protected:int *alist; //指向动态申请的一组空间int length;//整数的个数public:    Myarray(int len)//初始化,动态申请存储空间    {alist=new int[len];length=len;}    ~Myarray()//对象结束时,释放所占用的存储空间    {delete(alist);cout<<endl<<"再见!"<<endl;}    void Input()//输入数据    {        int i;        for(i=0;i<length;i++)        {cout<<"输入数组的第"<<i+1<<"个元素:"; cin>>alist[i];}    }    void Display()//显示数据    {cout<<'\n'<<"数组的成员为:"<<'\n';for(int i=0;i<length;i++) cout<<alist[i]<<' ';cout<<endl;    }};void main(){Myarray A(3);A.Input();A.Display();}(2)#include <iostream.h>class Myarray{protected:int *alist; //指向动态申请的一组空间int length;//整数的个数public:    Myarray(int len)//初始化,动态申请存储空间    {alist=new int[len];length=len;cout<<"Myarray 初始化..."<<endl;}    ~Myarray()//对象结束时,释放所占用的存储空间    {delete(alist);cout<<endl<<"再见!"<<endl;}    void Input()//输入数据    {        int i;        for(i=0;i<length;i++)        {cout<<"输入数组的第"<<i+1<<"个元素:"; cin>>alist[i];}    }    void Display()//显示数据    {cout<<'\n'<<"本数组成员依次为:"<<'\n';for(int i=0;i<length;i++) cout<<alist[i]<<' ';cout<<endl;    }};class SortArray:virtual public Myarray{public:    SortArray(int n):Myarray(n){  cout<<"SortArray 初始化..."<<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);B.Input();B.Display();cout<<endl<<"现在将数组内成员进行从小到大排序:"<<endl;B.sort();B.Display();}(3)#include <iostream.h>class Myarray{protected:int *alist; //指向动态申请的一组空间int length;//整数的个数public:    Myarray(int len)//初始化,动态申请存储空间    {alist=new int[len];length=len;cout<<"Myarray 初始化..."<<endl;}    ~Myarray()//对象结束时,释放所占用的存储空间    {delete(alist);cout<<endl<<"再见!"<<endl;}    void Input()//输入数据    {        int i;        for(i=0;i<length;i++)        {cout<<"输入数组的第"<<i+1<<"个元素:"; cin>>alist[i];}    }    void Display()//显示数据    {cout<<'\n'<<"本数组成员依次为:"<<'\n';for(int i=0;i<length;i++) cout<<alist[i]<<' ';cout<<endl;    }};class ReArray: virtual public Myarray{public:    ReArray(int n):Myarray(n){  cout<<"ReArray 初始化..."<<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);B.Input();B.Display();cout<<endl<<"现在将数组内成员进行前后逆转:"<<endl;B.turn();B.Display();}(4)#include <iostream.h>class Myarray{protected:int *alist; //指向动态申请的一组空间int length;//整数的个数public:    Myarray(int len)//初始化,动态申请存储空间    {alist=new int[len];length=len;cout<<"Myarray 初始化..."<<endl;}    ~Myarray()//对象结束时,释放所占用的存储空间    {delete(alist);cout<<endl<<"再见!"<<endl;}    void Input()//输入数据    {        int i;        for(i=0;i<length;i++)        {cout<<"输入数组的第"<<i+1<<"个元素:"; cin>>alist[i];}    }    void Display()//显示数据    {cout<<'\n'<<"本数组成员依次为:"<<'\n';for(int i=0;i<length;i++) cout<<alist[i]<<' ';cout<<endl;    }};class AverArray:virtual public Myarray{public:AverArray(int n):Myarray(n){  cout<<"AverArray 初始化..."<<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);B.Input();B.Display();cout<<endl<<"数组内成员的平均值为:";cout<<B.getaver()<<' '<<endl;}(5)#include <iostream.h>class Myarray{protected:int *alist; //指向动态申请的一组空间int length;//整数的个数public:    Myarray(int len)//初始化,动态申请存储空间    {alist=new int[len];length=len;cout<<"Myarray 初始化..."<<endl;}    ~Myarray()//对象结束时,释放所占用的存储空间    {delete(alist);cout<<endl<<"再见!"<<endl;}    void Input()//输入数据    {        int i;        for(i=0;i<length;i++)        {cout<<"输入数组的第"<<i+1<<"个元素:"; cin>>alist[i];}    }    void Display()//显示数据    {cout<<endl<<"本数组成员依次为:";for(int i=0;i<length;i++) cout<<alist[i]<<' ';cout<<endl;    }};class SortArray:virtual public Myarray//从小到大排序{public:    SortArray(int n):Myarray(n){  cout<<"SortArray 初始化..."<<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//前后逆转{public:    ReArray(int n):Myarray(n){  cout<<"ReArray 初始化..."<<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//求平均值{public:AverArray(int n):Myarray(n){  cout<<"AverArray 初始化..."<<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);B.Input();B.Display();B.fun();}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微店没有收到货怎么办 cf与主机连接不稳定怎么办 穿越火线与主机连接不稳定怎么办 word被锁定无法编辑怎么办 平衡车系统乱了怎么办 监控老是滴滴的响怎么办 磁盘已满 文件未保存怎么办 cocos只有代码没有项目怎么办 电脑系统管理员密码忘记了怎么办 魔兽小队不显示职业颜色怎么办 魔兽多余的橙装怎么办? f117-f6不读硬盘怎么办 中飞院飞行学生停飞了怎么办 军人对你敬礼时怎么办 小孩抱着就睡放下就醒怎么办 着火了怎么办 我的世界 生存战争2感冒了怎么办 生存战争2吐了怎么办 我的世界hqm重置怎么办 不小心打了110怎么办 我的世界皮肤有黑影怎么办 我的世界字体变大了怎么办 生锈的铁钉扎了怎么办 每天晚上窗纱上老有蝙蝠倒挂怎么办 我的世界没有痒怎么办 七日杀被ban了怎么办 吕框箱子上保护摸撕不掉怎么办 我的世界开光影卡怎么办 我的世界买不了怎么办 我的世界延迟高怎么办 我的世界过于昂贵怎么办 白色麻布染上别的颜色怎么办 印度老山檀香开裂了怎么办 专升本没过线怎么办 西安公租房小孩上学怎么办 全民k歌直播没人怎么办 在全民直播没人看怎么办 皮肤又黄又粗怎么办 被强制消费后应怎么办? 当保安不发工资怎么办? 辅警改革流管员怎么办