基类和派生类和虚基类的知识
题目例子如下
定义一个类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);
}