实验四 继承与派生讲解学习.docx
《实验四 继承与派生讲解学习.docx》由会员分享,可在线阅读,更多相关《实验四 继承与派生讲解学习.docx(12页珍藏版)》请在冰豆网上搜索。
实验四继承与派生讲解学习
实验四继承与派生
实验四 派生类与继承
【实验类型】验证性实验【实验课时】2学时
【实验目的】
(1)理解类的继承的概念,能够定义和使用类的继承关系。
(2)掌握派生类的声明与定义方法。
(3)熟悉公有派生和私有派生的访问特性。
(4)学习虚基类在解决二义性问题中的作用。
【实验环境】
硬件:
计算机
软件:
MicrosoftVisualC++6.0
【实验内容】
1、按要求阅读、编写、调试和运行以下程序。
(1)实验内容
①定义一个基类MyArray,基类中可以存放一组整数。
classMyArray
{public:
MyArray(intleng);
~MyArray();
voidInput();
voidDisplay();
protected:
longint*alist; //指向动态申请的一组空间
intlength;}; //整数的个数
基类中有构造函数、析构函数、输入数据和输出数据的函数。
②定义一个类SortArray继承自MyArray,在该类中定义函数实现排序功能。
③定义一个类ReArray继承自MyArray,在该类中定义函数实现逆转功能。
④定义一个类AverArray继承自MyArray,在该类中定义函数Aver求解整数的平均值。
⑤定义NewArray类,同时继承了SortArray,ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转、和求平均值的功能。
在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用。
(2)实验程序(参考)
程序如下:
#include"iostream.h"
#include"process.h"
classMyArray
{public:
MyArray(intleng);
~MyArray();
voidInput();
voidDisplay();
protected:
longint*alist; //指向动态申请的一组空间
intlength; //整数的个数
};
MyArray:
:
MyArray(intleng)
{ length=leng;
alist=newlongint[length];
if(alist==NULL)
{
cout<<"对不起,创建失败。
请重试。
";exit
(1);
}
}
MyArray:
:
~MyArray()
{
delete[]alist;
cout<<"数组被清空。
"<}
voidMyArray:
:
Display() //显示数组内容
{
inti;
longint*p=alist;
for(i=0;i cout<<""<<*p;
}
voidMyArray:
:
Input() //从键盘若干整数
{
cout<<"请输入:
"<";
inti;
longint*p=alist;
for(i=0;i cin>>*p;
}
classSortArray:
virtualpublicMyArray
{
private:
intlen;
longint*sp;
public:
SortArray(intleng):
MyArray(leng)
{
len=leng;
Sort();
};
voidSort()
{
sp=newlongint[len];
longintq;
sp=alist;
for(inti=0;i{
for(intj=0;j{
if(*(sp+j)>*(sp+j+1))
{
q=*(sp+j);
*(sp+j)=*(sp+j+1);
*(sp+j+1)=q;
}
}
}
}
};
classReArray:
virtualpublicMyArray
{
//这里是虚基类,
public:
voidReverse()
{
rp=newlongint[len];
longintq;
rp=alist;
for(inti=0;i {
q=*(rp+i);
*(rp+i)=*(rp+len-i-1);
*(rp+len-i-1)=q;
}
}
ReArray(intleng):
MyArray(leng)
{
len=leng;
Reverse();
}
private:
intlen;
longint*rp;
};
classAverArray:
virtualpublicMyArray
{ // 这里是虚基类,
public:
doubleAver()
{
ap=newlongint[len];
doubleq=0;
ap=alist;
for(inti=0;i {
q=q+*ap;
ap++;
}
q=q/len;
returnq;
}
AverArray(intleng):
MyArray(leng)
{
len=leng;
}
private:
intlen;
longint*ap;
};
classNewArray:
publicReArray,publicSortArray,publicAverArray
{public:
NewArray(intleng);
~NewArray();
};
NewArray:
:
NewArray(intleng):
MyArray(leng),SortArray(leng),ReArray(leng),AverArray(leng)
{
cout<<"\n新数组正在创建。
\n";
}
NewArray:
:
~NewArray()
{
cout<<"\n新数组已被清空。
\n";
}
voidmain()
{
charb;
intleng;
do
{
cout<<"请输入数组长度:
"< cin>>leng;
while(leng<=0)
{
cout<<"数组长度必须为大于零的整数,请重新输入数组长度:
\n";exit
(1);
cin>>leng;
}
cout<<"\n开始:
\n";
NewArrayn(leng);
n.Input();
cout<<"\n您输入的数组为:
"< n.Display(); //显示数组
n.Reverse(); //显示逆序
cout<<"\n倒序数组为:
"< n.Display(); //显示逆转以前的情况
cout<<"\n平均值是:
"< n.Sort(); //排序
cout<<"\n排序后(从小到大)数组为:
"< n.Display(); //显示排序以后的情况
cout<<"\n[A]继续 [Q]退出"< cin>>b;
}while(b=='A'||b=='a');
}
执行结果为:
2、编写一个学生和教师数据输入和显示程序。
(1)实验内容
编写学生和教师数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类。
(2)实验程序(参考)
#include
classperson
{
protected:
intm;
charA[20];
char*name;
public:
voidinput()
{
cout<<"编号:
";
cin>>m;
cout<<"姓名:
";
cin>>A;
name=&A[0];
}
voiddisplay()
{
cout<<"编号:
"< cout<<"姓名:
"<}
};
classstudent:
publicperson
{
protected:
intclassnum,mark;
public:
voidinput1()
{
cout<<"输入一个学生数据:
"< input();
cout<<"班号:
";
cin>>classnum;
cout<<"成绩:
";
cin>>mark;
}
voiddisplay1()
{
cout<<"显示一个学生的数据:
"< display();
cout<<"班号:
"< cout<<"成绩:
"<}
};
classteacher:
publicperson
{
protected:
charzhicheng[20],bumen[20];
char*p;
public:
voidinput2()
{
cout<<"显示一个老师的数据:
"< input();
cout<<"职称:
";
cin>>zhicheng;
cout<<"部门:
";
cin>>bumen; }
voiddisplay2()
{
cout<<"显示一个老师的数据:
"< display();
p=&zhicheng[0];
cout<<"职称:
"<
p=&bumen[0];
cout<<"部门:
"<
}
};
voidmain()
{
studentS;
teacherT;
S.input1();
T.input2();
S.display1();
T.display2();
}
【实验提示】
继承是面向对象程序设计的一个重要特性,它允许在已有类的基础上创建新的类,新类可以从一个或多个既有类中继承函数和数据,而且可以重新定义或加进新的数据和函数,从而形成类的层次或等级。
实验1中着重时在这方面进行练习,除了需要熟练掌握派生类的声明和定义,还需要灵活运用公有派生和私有派生来解决实际问题。
虚基类用于想把公共的基类只产生一个拷贝时,它的初始化与一般的多继承的初始化在语法上是一样的,但是构造函数的调用顺序不同。
C++编程中派生类可以被基类指针引用,这叫向后兼容,可以提高程序的可扩充性和可维护性。
以前写的程序可以被将来写的程序调用不足为奇,但是将来写的程序可以被以前写的程序调用那可了不起。
C++语言中的技巧很多,需要熟练掌握,才能灵活运用。
【实验思考】
①实验1中有何错误,应怎样修改?
②实验2中程序是否不简结,应如何修改或者你会如何设计程序?
【实验报告要求】
①内容要求:
ⅰ.实验题目
ⅱ.实验目的
ⅲ.实验过程(含程序代码)
ⅳ.实验结果
ⅴ.实验思考题
②验报告书写要整洁、有条理。