实验六继承三 2文档格式.docx
《实验六继承三 2文档格式.docx》由会员分享,可在线阅读,更多相关《实验六继承三 2文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
public:
X(inta=0){x=a;
}//基类X的构造函数
voidset_x(inta){x=a;
}
voidshow(void)
{cout<
<
"
x="
x;
};
classY
{inty;
Y(intb=0){y=b;
}//基类Y的构造函数
voidset_y(intb){y=b;
y="
y;
classZ:
publicX,publicY
//classZ:
publicX,privateY
{intz;
Z(inta=0,intb=0,intc=0):
X(a),Y(b)
{z=c;
}//派生类Z的构造函数
voidset_xyz(inta,intb,intc)
{set_x(a);
set_y(b);
z=c;
voidshow_z(void)
z="
z;
voidprint(void)
{show();
//显示x的值
show();
//显示y的值
show_z();
//显示z的值
}
voidmain()
{Zobj1(3,4,5),obj2;
obj2.set_xyz(10,20,30);
obj1.print();
cout<
endl;
obj2.print();
问题:
⑴编译该程序,会出现编译错误,其原因是在定义Z类的print()成员函数中的show()函数调用时出现了。
解决的方法是:
⑵将“show();
//显示x的值”中的“show()”改为
⑶将“show();
//显示y的值”中的“show()”改为
⑷调试成功后的输出结果是:
⑸成员函数voidset_xyz(inta,intb,intc)中“set_x(a)”的作用是,“set_y(b)”的作用是。
程序2(exp_602.cpp)
classbase
{private:
inta;
public:
base(intx)
{a=x;
cout<
Constructingbasea="
a<
classbase1:
publicbase
intb;
base1(intx1,intx2):
base(x1)
{b=x2;
Constructingbase1b="
b<
classbase2:
intc;
base2(intx1,intx2):
{c=x2;
Constructingbase2c="
c<
classderived:
publicbase1,publicbase2
intd;
derived(intx1,intx2,intx3,intx4):
base1(x1,x2),base2(x1,x3)
{d=x4;
Constructingderivedd="
d<
voidmain(void)
{derivedobj(2,3,4,5);
⑹编译运行程序的输出结果是:
⑺从输出结果中可看出,间接基类“base”被调用了两次,产生原因是“derived”的两个直接基类“base1”、“base2”拥有共同基类“base”,产生了。
⑻将程序中“classbase1:
publicbase”改为“classbase1:
virtualpublicbase”
“classbase2:
publicbase”改为“classbase2:
“derived(intx1,intx2,intx3,intx4):
base1(x1,x2),base2(x1,x3)”改为
base(x1),base1(x1,x2),base2(x1,x3)”
重新编译运行程序的输出结果是:
⑼“virtualpublicbase”表示间接基类“base”为。
㈡知识应用实验
按要求调试程序(完善类的定义及主程序)。
1.题目:
通过继承方式处理学生成绩。
2.内容
⑴类的定义:
人“person”类(person.h中定义):
包括姓名、性别、出生日期(日期“date”本身是一个类,包括年、月、日三个成员——定义在date.h中)三个数据成员;
学生“student”类(student.h中定义),公有继承person类,新增学号、系、进校时间(date对象)三个数据成员;
成绩score类(score.h中定义):
新增课程科数、成绩数组数据成员。
⑵成绩处理:
源程序存放在“exp_603.cpp”中。
3.要求
⑴完善类的定义;
⑵程序调试办法:
每建好一个类,均在main()函数中进行测试成功后再定义下一个类,测试程序以“exp_test.cpp”存盘;
⑶所有类定义测试后再调试、完善成绩处理程序。
程序:
//测试程序exp_test.cpp
iomanip.h>
#include"
"
//用不同类头文件
voidmain()
{……}
//各个类的定义
//date类的定义:
存放在date.h中
classdate
intyear,month,day;
//年、月、日三个私有成员
date(void)
{year=1980;
month=1;
day=1;
voidset_date(inty,intm,intd)
{}//完成成员函数的定义
intget_year(void)
intget_month(void)
intget_day(void)
//person类的定义:
保存在person.h中
string.h>
date.h"
classperson
{protected:
charname[11];
charsex[2];
datebirthday;
person(void);
//无参构造函数
voidset_person(char*na,char*s,inty,intm,intd);
char*get_name(void)
char*get_sex(void)
{returnbirthday.get_month();
voidprint(void);
person:
:
person(void)//无参构造函数
{strcpy(name,"
无名氏"
);
strcpy(sex,"
男"
birthday.set_date(1980,1,1);
voidperson:
set_person(char*na,char*s,inty,intm,intd)
{}//完成成员函数的定义
print(void)
{cout<
姓名:
name<
性别:
sex<
出生日期:
birthday.get_year()<
年"
;
birthday.get_month()<
月"
birthday.get_day()<
日"
//student类的定义:
存放在student.h中
person.h"
classstudent:
publicperson
{public:
intid;
chardepartment[20];
dateenterdate;
student(void);
voidset_student(intn,char*s,inty,intm,intd);
intget_id(void)
char*get_department(void)
intget_enteryear(void)
intget_entermonth(void)
intget_enterday(void)
voidprint_base();
student:
student(void)
id=0;
strcpy(department,"
计算机"
enterdate.set_date(2000,9,1);
voidstudent:
set_student(intn,char*s,inty,intm,intd)
//n、s、y、m、d分别为id、department、enterdate提供值
学号:
id<
person:
print();
cout<
系(专业):
department<
进校日期:
enterdate.get_year()<
enterdate.get_month()<
enterdate.get_day()<
print_base()
setw(8)<
get_id();
setw(12)<
get_name();
setw(4)<
get_sex();
setw(6)<
get_year()<
-"
get_month()<
get_day();
setw(20)<
get_department();
get_enteryear()<
get_entermonth();
get_enterday()<
//score类的定义:
存放在score.h中
student.h"
constintM=10;
classscore:
publicstudent
floatsc[M],aver;
intm;
score(void);
voidset_score(floatx[],intn);
//提供成绩
floatget_score(inti)//得到第i科成绩
floatget_aver(void)//得到平均成绩
voidprint_score(void);
score:
score(void)//无参构造函数
{
strcpy(name,"
inti;
m=M;
for(i=0;
i<
m;
i++)
sc[i]=0;
aver=0;
voidscore:
set_score(floatx[],intn)//提供成绩:
完成成员函数的定义
{inti;
floatsum=0;
m=n;
{}
aver=sum/m;
print(void)//重载输出print()
{student:
sc[i];
aver<
print_score(void)
{intj;
for(j=0;
j<
j++)
get_score(j);
get_aver()<
//成绩处理程序:
保存在exp_603.cpp中
score.h"
voidinput_base(score*p,intn);
//学生基本数据输入
voidinput_score(score*p,intn,intm);
//学生成绩输入
voidprint_base(score*p,intn);
//学生基本数据输出
voidprint_score(score*p,intn,intm);
//学生成绩输出
score&
average(score*p,intn,intm);
//普通函数:
平均成绩计算
voidsort(score*p,intn,intm);
//普通函数:
按平均成绩排序
{intn,m;
学生人数:
cin>
>
n;
考试科数:
cin>
score*p,aver;
p=newscore[n];
//动态分配内存单元——动态数组
if(p==NULL)
{cout<
内存分配失败"
return;
intch;
do
{
\n\n请选择:
\n"
1.输入学生基本数据\n"
2.输入学生成绩\n"
3.计算课程平均成绩\n"
4.输出学生基本数据\n"
5.输出学生成绩\n"
6.按平均成绩排序\n"
0.退出\n"
\n输入你的选择:
cin>
ch;
switch(ch)
{case1:
input_base(p,n);
break;
case2:
input_score(p,n,m);
case3:
aver=average(p,n,m);
case4:
print_base(p,n);
case5:
print_score(p,n,m);
aver.print_score();
case6:
sort(p,n,m);
case0:
break;
while(ch);
delete[]p;
//释放内存
voidinput_base(score*p,intn)//学生基本数据输入
{inti,id,y1,m1,d1,y2,m2,d2;
charname[11],sex[3],dpt[20];
\n请输入学生基本数据:
第"
i+1<
个学生:
id;
name;
sex;
出生年:
y1;
出生月:
m1;
出生日:
d1;
所在系:
dpt;
入学年:
y2;
入学月:
m2;
入学日:
d2;
p[i].set_person();
//完成函数的调用
p[i].set_student();
voidinput_score(score*p,intn,intm)
{inti,j;
floatx[M];
p[i].get_id()<
p[i].get_name()<
的成绩:
j+1<
科成绩:
x[j];
p[i].set_score();
voidprint_base(score*p,intn)
p[i].print_base();
voidprint_score(score*p,intn,intm)
p[i].print_score();
average(score*p,intn,intm)//用返回引用的方法
floats[M]={0};
staticscoreaver;
//返回的对象必须是静态的
{for(i=0;
s[j]=s[j]+p[i].get_score(j);
s[j]=s[j]/n;
aver.set_person("
平均成绩"
"
0,0,0);
aver.set_score();
returnaver;
voidsort(score*p,intn,intm)//选择法排序:
完成空白处的内容
{scoret;
floata;
inti,j,k;
n-1;
{a=p[i].get_aver();
k=i;
for(j=i+1;
if()
{a=p[j].get_aver();
k=j;
{t=p[i];
p[i]=p[k];
p[k]=t;
㈢程序设计实验
编程对日期时间型数据进行处理。
要求:
1、定义日期型“Date”类,保存在“date.h”中(成员函数包括日期赋初值,设置日期,读取年、月、日,显示年、月、日及判断是否闰年等)。
2、定义时间型“Time”类,保存在“Time.h”中(与实验一中的类相同)。
3、定义日期时间型“DateTime”类保存在“datetime.h”中:
⑴公有继承Date类及Time类;
⑵不增加数据成员;
⑶增加日期时间处理成员函数,包括初始化日期时间、设置日期时间、显示日期时间等。
4、编写main()函数保存在“exp_603.cpp”中,内容自定。
五、实验收获与创新
1.自己拟定一个解决实际问题的题目,综合应用实验一至实验六的知识编程实现。
2.通过实验四、实验五、实验六,谈谈你对面向对象程序设计继承的认识。