C上机实验报告实验五文档格式.docx
《C上机实验报告实验五文档格式.docx》由会员分享,可在线阅读,更多相关《C上机实验报告实验五文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
3.实验内容及实验步骤
1.编写程序定义基类Animal,成员变量age定义为私有的。
构造派生类dog,在其成员函数SetAge(intn)中直接对age赋值时,会出现类似以下的错误提示:
errorC2248:
‘age’:
cannotaccessprivatememberdeclaredinclass‘Animal’
把age改为公有成员变量后重新编译就可以了。
程序名:
lab7_1.cpp。
2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。
lab7_2.cpp。
3.用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。
4.编写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。
再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。
程序名:
lab7_3.cpp。
编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。
这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。
4.思考题
1.如何在已有的类的基础上设计新的类?
采用类的派生的方法,利用基类派生出子类,子类继承基类的属性,从而在已有基类的基础上设计新的派生类,模式如下:
class派生类名:
继承方式基类名1,继承方式基类名2,…,继承方式基类名n
{
派生类成员声明;
};
2.基类和派生类对象的构造顺序是怎样的?
先调用基类的构造函数,然后再调用内嵌对象(派生类中的对象)的构造函数。
基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在类中声明的顺序。
3.如何利用虚基类解决二义性问题?
将共同基类设置为虚基类,语法为:
virtual继承方式基类名
5.源程序
Lab7_1.cpp
#include<
iostream>
usingnamespacestd;
classAnimal//Animal类
/*private:
intage;
*/
public:
Animal(){}
~Animal(){}
Animal(int);
classDog:
publicAnimal//Dog类,Animal的公有派生类
private:
intnumber;
Dog(){}
~Dog(){}
Dog(int,int);
voidsetAge(int);
voidshowNumber();
voidshowAge();
Animal:
:
Animal(inta)//Animal构造函数
age=a;
}
Dog:
Dog(intn,inta)//Dog构造函数
number=n;
voidDog:
setAge(intn)//Dog成员函数,setAge
age=n;
//数据输出函数
showNumber()
cout<
<
"
Number:
number<
endl;
showAge()
Age:
age<
intmain()
Dogdog1(12,0);
dog1.setAge(7);
dog1.showNumber();
dog1.showAge();
return0;
Lab_2
classBaseClass
intgrade;
intpopulation;
BaseClass(intg,intp)//BaseClass的构造函数
{
grade=g;
population=p;
cout<
constructingBaseClass"
}
~BaseClass()//析构
destructingBaseClass"
classDerivedClass:
publicBaseClass
charname;
DerivedClass(intg,intp,charn):
BaseClass(g,p)//DerivedClass的构造函数
name=n;
constructingDerivedClass"
~DerivedClass()
destructingDerivedClass"
DerivedClassa(7,55,'
A'
);
Lab_3
classVehicle
floatmaxspeed;
floatweight;
Vehicle(){}
Vehicle(floatm,floatw)
maxspeed=m;
weight=w;
~Vehicle(){}
voidrun()
Vehiclerunning"
voidstop()
Vehiclestopping"
classBicycle:
virtualpublicVehicle
floatheight;
Bicycle(floatm,floatw,floath):
Vehicle(m,w)
height=h;
Bicycle(floath)
~Bicycle(){}
classMotorcar:
intseatnum;
Motorcar(floatm,floatw,ints):
seatnum=s;
~Motorcar(){}
Motorcar(floats)
classMotorbicycle:
publicBicycle,publicMotorcar
Motorbicycle(floatm,floatw,floath,ints):
Vehicle(m,w),Bicycle(h),Motorcar(s){}
voidshowInformation()
Themaxspeedofthismotorbicycleis:
maxspeed<
Theweightofthismotorbicycleis:
weight<
Theheightofthismotorbicycleis:
height<
Theseatnumberofthismotorbicycleis:
seatnum<
Motorbicyclea(60,21.5,45.8,2);
a.run();
a.showInformation();
a.stop();
6.运行结果
Lab7_1
age为Animal的私有成员数据时:
编译报错
age为Animal的公有成员数据时:
正常运行
7.心得体会:
熟悉并了解了如果利用基类进行派生,得到派生类,明白了public,protect,private三种派生类型的区别,能够较好的利用继承的方法,来创建新的子类。
并且学习了使用虚基类继承的方式,使基类中的成员对象仅被创建一次,收获颇多。