实验四-继承与派生

基类和派生类和虚基类的知识

题目例子如下

定义一个类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类的对象同时具有排序、逆转和求平均值的功能。在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。

代码执行

#include "iostream"
using namespace std;
class MyArray
{
public:
    MyArray(int len);		//初始化,动态申请存储空间
    ~MyArray();			//对象结束时,释放所占用的存储空间
    void Input();			//输入数据
    void Display();		//显示数据
protected:
    int* alist;     //指向动态申请的一组空间
    int length;    //整数的个数
};
MyArray::MyArray(int len)
    {
     length = len;
     alist = new int[length];
     cout << "虚基类初始化完毕"<<endl;
    }
MyArray::~MyArray()
{
    delete alist;//正确
}
void MyArray:: Input()		//输入数据
{
    int i;
    cout << "数组赋值:" << endl;
    for (i = 0; i < length; i++)
    {
        cout << "alist[" << i << "]=";
        cin >> alist[i];
        cout << ends;
    }

}
void MyArray::Display()		//输出数据
{
    int i;
    cout << "数组输出:" << endl;
    for (i = 0; i < length; i++)
    {
        cout << "alist[" << i << "]=";
        cout<<alist[i];
        cout << endl;
    }

}
class SortArray :public virtual MyArray//排序功能
{
public:
    
    SortArray(int a):MyArray(a)
    {
        cout << "排序派生类初始化完毕"<<endl;
    }
    void Sort()//冒泡排序法
    {   int i, j, temp;
 for (i=0; i<= (length - 1); i++)
   for(j=0;j<=(length-2);j++)
       if (alist[j] > alist[j + 1])
       {
           temp = alist[j];
           alist[j] = alist[j + 1];
           alist[j + 1] = temp;
       }
 cout << "排序后的数组输出:" << endl;
 for (i = 0; i < length; i++)
 {
     cout << "alist[" << i << "]=";
     cout << alist[i];
     cout << " "<< endl;
 }
    }
   
};
class AverArray :public virtual MyArray
{
public:

    AverArray (int a) :MyArray(a)
    {
        cout << "平均值派生类初始化完毕" << endl;
    }
    void Aver()//求平均值
    {
        int i,sum=0;
        float a;
        for (i = 0; i < length; i++)
        {
            sum += alist[i];
        }
        a = sum / length;
        cout << "数组平均值Aver=" << a << endl;
       
    }

};
class ReArray :public virtual MyArray
{
public:

    ReArray(int a) :MyArray(a)
    {
        cout << "数组逆转派生类初始化完毕" << endl;
    }
    void Re()//数组逆转
    {
        int i, temp;
        for (i = 0; i < length/2; i++)
        {
            temp = alist[i];
            alist[i] = alist[length - 1 - i];
            alist[length - 1 - i] = temp;
        }
        cout << "逆转后的数组输出:" << endl;
        for (i = 0; i < length; i++)
        {
            cout << "alist[" << i << "]=";
            cout << alist[i];
            cout << "  "<<endl;
        }
    }

};
class NewArray :public ReArray, public SortArray, public AverArray
{
public:
    NewArray(int v) :SortArray(v), ReArray(v), AverArray(v),MyArray(v)
    {
        cout << "NewArry初始化完毕"<<endl;
    }
};
void main()
{
    int yyds;
    cout << "同学,你是天津工业大学的吗?" << endl << "如果是,请输入天津工业大学的邮编,如果输入错误,程序不能执行" << endl;
    cout << "请输入:" << " ";
    cin >> yyds;
    if (yyds == 300387)
    {




        int n;
        cout << "请输入数组大小=";
        cin >> n;

        //实现那部分功能调用对应的函数就行
       /*数组显示和输出
       MyArray k(n);
        k.Input();
        k.Display();
        */
        /*数组排序
        SortArray p(n);
        p.Input();
        p.Sort();
        p.Display();
        */
        /*数组求平均值
        AverArray p(n);
        p.Input();
        p.Aver();
        p.Display();
        */
        /*数组逆转
           ReArray p(n);
        p.Input();
        p.Re();
        p.Display();*/
        NewArray g(n);
        g.Input();
        g.Display();
        g.Re();//逆转
        g.Sort();//排序
        g.Aver();//求平均值


    }
    else
        cout << "输入错误,您不可以使用";
        while (1);
    

}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁芜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值