C++继承与派生实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++继承与派生实验报告

应用数学学院信息与计算科学(信息计算)专业

1 班、学号3111008106

姓名吴伟栓教师评定_________________

实验题目继承与派生

一、实验目的与任务

实验目的:

(1)学习声明和使用类的继承关系,声明派生类。

(2)熟悉不同继承方式下对基类成员的访问控制。

(3)学习利用虚基类解决二义性问题。

实验任务:

(1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。

(2)声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。

(3)声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop 等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle 和motorcar派生出摩托车(motocycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。

(4)(选做)从实验六中的people(人员)类派生出student(学生)类,添加属性:班号char classNo[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacherradviser;从graduate类和teacher 类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。

二、实验步骤

(1)编写程序声明基类Animal,成员变量age声明为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:error

c2248:’age’:can not access private member declared in class ‘Animal’把age改为公有成员变量后重新编译就可以了。

(2)编写程序声明一个基类BaseClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。

(3)用Debug功能跟踪程序(2)的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。

(4)编写程序声明一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和mororcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。

(5)编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译

成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。

三、实验方案

(1)

(2)

四、实验结果

实验一:

编译不通过

实验二

程序运行结果如下:

实验二

在lab7_2中,创建了一个派生类DerivedClass的对象a,先调用基类BaseClass的构造函数,再调用派生类DerivedClass的构造函数,当对象a 消失时,先调用派生类DerivedClass的析构函数,再调用基类BaseClass 的析构函数。由此可见,构造函数和析构函数的调用顺序是相反的。

实验三

此程序的结果如下:

不把vehicle设为虚基类,编译不通过

五、结论

实验一

从运行结果看,本程序是错误的,原因在于dog类的成员函数无法访问到Animal类的私有成员。将age改为公有成员后,得到如下正确程序:

程序运行结果如下:

实验二

在此程序中,创建了一个派生类的对象,先调用基类的构造函数,再调用派生类的构造函数,当对象消失时,先调用派生类的析构函数,再调用基类的析构函数。由此可见,构造函数和析构函数的调用顺序是相反的。

实验二

在lab7_2中,创建了一个派生类DerivedClass的对象a,先调用基类BaseClass的构造函数,再调用派生类DerivedClass的构造函数,当对象a 消失时,先调用派生类DerivedClass的析构函数,再调用基类BaseClass 的析构函数。由此可见,构造函数和析构函数的调用顺序是相反的。

实验三

如果不把vehicle设为虚基类,系统编译则不通过。原因在于类bicycle、motorcar、motorcycle中的Run、Stop成员函数是从基类vehicle派生而来的,在这些直接基类中从上一级共同基类继承来的成员函数就有相同的名称。在派生类对象中,这些同名函数成员在内存中同时存在拥有多个副本,同一个函数名会有多个映射。解决的办法就是将共同基类vehicle设置为虚基类,这时从不同的路径继承来的同名函数成员在内存中就只有一个副本,同一个函数成员也只有一个映射。

六、问题与讨论

问题一:把数据成员设置为共有的,这样合理吗?

本人认为在选作题中是可以的,因为你要把人员的信息显示出来,供大家看,就不存在隐私。

问题二:关于虚基类的一些调用是如何进行的?

将共同基类设置为虚基类,在派生类中声明的对象可以访问到虚基类的公有函数,并且最远的派生类也可以调用其他继承虚基类的派生类中的公有函数。如果虚基类中有同名函数,则调用的函数就取决于对象是哪个类的。以上所有对象必须遵循:慢声明类的对象可以访问先声明的,但是反之不成立。

问题三:派生类的构造函数初始化基类的构造函数有什么简便的作法?

针对数据过多的构造函数,一个一个初始化,很麻烦,本人到现在也不知道有啥好方法,真心求解。

问题四:继承与派生类有什么好处?

类的继承允许程序员在保持原有类的基础上,进行更具体,更详细的类定义。新的类由原有的类所产生,可以说新类继承了原有类的特征。派生新类的过程一般包括吸收原有类的成员,改造原有类的成员和添加新成员3个步骤。

相关文档
最新文档