最新C++语言程序设计实验答案继承与派生资料Word格式.docx
《最新C++语言程序设计实验答案继承与派生资料Word格式.docx》由会员分享,可在线阅读,更多相关《最新C++语言程序设计实验答案继承与派生资料Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
------已启动生成:
项目:
cpp,配置:
DebugWin32------
生成启动时间为2013-2-1811:
10:
35。
InitializeBuildStatus:
正在创建“Debug\cpp.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
ClCompile:
main.cpp
f:
\projects\cpp\cpp\main.cpp(13):
errorC2248:
“Animal:
:
age”:
无法访问private成员(在“Animal”类中声明)
f:
\projects\cpp\cpp\main.cpp(8):
参见“Animal:
age”的声明
\projects\cpp\cpp\main.cpp(5):
参见“Animal”的声明
\projects\cpp\cpp\main.cpp(14):
生成失败。
已用时间00:
00:
03.28
==========生成:
成功0个,失败1个,最新0个,跳过0个==========
把age改为公有变量后重新编译就可以了。
程序名:
lab7_1.cpp。
★程序及运行结果:
//lab7_1.cpp
#include<
iostream>
usingnamespacestd;
classAnimal{
private:
//private时出错
//public:
//public和protected正确
intage;
};
classdog:
publicAnimal{
public:
voidSetAge(intn){age=n;
}
intGetAge(){returnage;
voidmain()
{dogd;
d.SetAge(3);
cout<
<
"
Age="
d.GetAge()<
endl;
用public时的结果:
2.(编程)声明一个基类BaseClass,构造其派生类DerivedClass。
在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。
lab7_2.cpp。
参考的运行结果:
//lab7_2.cpp
classBaseClass{
BaseClass(){cout<
构造了一个BaseClass类的对象."
~BaseClass(){cout<
析构了一个BaseClass类的对象."
intNumber;
classDeriveClass:
publicBaseClass{
DeriveClass(){cout<
构造了一个DeriveClass类的对象."
~DeriveClass(){cout<
析构了一个DeriveClass类的对象."
{DeriveClassa;
3.(操作)用调试功能跟踪程序lab7_2的执行过程。
观察基类和派生类的构造函数和析构函数的执行情况。
4.(编程)声明一个车(vehicle)虚基类。
由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。
再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。
lab7_3.cpp。
//lab7_3.cpp
classvehicle{//车类,作为基类
protected:
intMaxSpeed,Weight;
//最大速度,重量
voidRun(){cout<
车vehicle类开始运行!
voidStop(){cout<
车vehicle类停止运行!
classbicycle:
virtualpublicvehicle{//自行车类:
公有继承虚基类vehicle
intHeight;
//高度
classmotorcar:
virtualpublicvehicle{//汽车类:
intSeatNum;
//座位数
classmotorcycle
:
publicbicycle,publicmotorcar{//摩托车类:
公有继承自行车类和汽车类
voidSetdata(intms,intwt,intht,intsn)
{MaxSpeed=ms;
Weight=wt;
Height=ht;
SeatNum=sn;
};
voidShow(){
cout<
最大速度:
MaxSpeed<
重量:
Weight
<
高度:
Height<
座位数:
SeatNum<
voidmain(){
int类型占用字节数:
"
sizeof(int)<
vehicle占用字节数:
sizeof(vehicle)<
bicycle占用字节数:
sizeof(bicycle)<
motorcar占用字节数:
sizeof(motorcar)<
motorcycle占用字节数:
sizeof(motorcycle)<
motorcyclemt;
mt.Run();
mt.Setdata(100,200,130,2);
mt.Show();
mt.Stop();
}
为什么?
按推算应该是:
vehicle占用8字节;
bicycle占用12字节;
motorcar占用12字节;
motorcycle占用16字节。
5.(验证)把vehicle设置为非虚基类。
再编译一次,此时系统报错,无法编译成功。
这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。
访问vehicle的成员时指明继承路径后,可以纠正二义性错误,试修改程序,然后运行。
★程序的运行结果:
(1)没有指明继承路径(运行结果)
将上面的程序的bicycle类和motorcar类改为非虚基类公有继承vehicle类后,编译时出现二义(ambiguous)性错误:
23:
32。
\projects\cpp\cpp\main.cpp(27):
errorC2385:
对“MaxSpeed”的访问不明确
可能是“MaxSpeed”(位于基“vehicle”中)
也可能是“MaxSpeed”(位于基“vehicle”中)
对“Weight”的访问不明确
可能是“Weight”(位于基“vehicle”中)
也可能是“Weight”(位于基“vehicle”中)
\projects\cpp\cpp\main.cpp(29):
\projects\cpp\cpp\main.cpp(30):
\projects\cpp\cpp\main.cpp(42):
对“Run”的访问不明确
可能是“Run”(位于基“vehicle”中)
也可能是“Run”(位于基“vehicle”中)
errorC3861:
“Run”:
找不到标识符
\projects\cpp\cpp\main.cpp(45):
对“Stop”的访问不明确
可能是“Stop”(位于基“vehicle”中)
也可能是“Stop”(位于基“vehicle”中)
“Stop”:
01.07
(2)指明继承路径(程序及运行结果)
将vehicle中数据成员和函数成员指明路径。
publicvehicle{//自行车类:
publicvehicle{//汽车类:
voidSetdatabicycle(intms,intwt,intht,intsn){
bicycle:
MaxSpeed=ms;
bicycle:
Weight=wt;
//修改,指明路径
Height=ht;
voidShowbicycle(){
bicycle:
//修改,指明路径
mt.bicycle:
Run();
mt.Setdatabicycle(100,200,130,2);
mt.Showbicycle();
mt.motorcar:
Stop();
6.以实验6中的people(人员)类为基类,派生相应的类。
按任务7_4的要求编写程序,并运行。
(1)lab6_7.h:
People(人员)类的声明及成员函数的实现
//lab6_7.h
cstring>
classDate{
intyy,mm,dd;
Date(){}
Date(Date&
d):
yy(d.yy),mm(d.mm),dd(d.dd){}//增添
~Date(){}
intGetyy()const{returnyy;
intGetmm()const{returnmm;
intGetdd()const{returndd;
voidSetyy(inty){yy=y;
voidSetmm(intm){mm=m;
voidSetdd(intd){dd=d;
classPeople{
charname[11];
//姓名,增添
charnumber[7];
//编号,改为数组
charsex[3];
//男或女,改为数组
Datebirthday;
//出生日期
charid[16];
//身份证号,改为数组
People(){}
People(People&
p);
~People(){}
voidGetname(charna[]){strcpy(na,name);
voidGetnumber(charnu[]){strcpy(nu,number);
voidGetsex(charse[]){strcpy(se,sex);
intGetbirthyy()const{returnbirthday.Getyy();
intGetbirthmm()const{returnbirthday.Getmm();
intGetbirthdd()const{returnbirthday.Getdd();
voidGetid(chard[]){strcpy(d,id);
voidSetname(charna[]){strcpy(name,na);
voidSetnumber(charnu[]){strcpy(number,nu);
voidSetsex(charse[]){strcpy(sex,se);
voidSetbirthyy(inty){birthday.Setyy(y);
voidSetbirthmm(intm){birthday.Setmm(m);
voidSetbirthdd(intd){birthday.Setdd(d);
voidSetid(chard[]){strcpy(id,d);
voidinput();
voidoutput();
People:
People(People&
p)
birthday(p.birthday)
{
strcpy(name,p.name);
strcpy(number,p.number);
strcpy(sex,p.sex);
strcpy(id,p.id);
inlinevoidPeople:
input()
姓名:
;
cin>
>
name;
编号:
number;
性别(男/女):
sex;
出生日期(年月日):
inty,m,d;
y>
m>
d;
Setbirthyy(y);
Setbirthmm(m);
Setbirthdd(d);
身份证号:
id;
output()
name<
\n编号:
number<
性别:
sex<
出生日期:
Getbirthyy()<
年"
<
Getbirthmm()<
月"
Getbirthdd()<
日"
id<
(2)lab7_4.h:
People类的派生类
//lab7_4.h
#include"
lab6_7.h"
classstudent:
virtualpublicPeople{//学生类
charclassNo[7];
//班号
student(){}
student(student&
st):
People(st){strcpy(classNo,st.classNo);
}//使用类型兼容规则
~student(){}
voidGetclassNo(charcNo[]){strcpy(cNo,classNo);
voidSetclassNo(char*c){strcpy(classNo,c);
voidinput()
{People:
input();
班号:
classNo;
voidoutput()
output();
classNo<
classteacher:
virtualpublicPeople{//教师类
charprincipalship[11];
//职务
chardepartment[21];
//部门
teacher(){}