c++继承习题

更新时间:2024-03-20 02:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、实验目的:

(1) 学习定义和使用类的继承关系,定义派生类。 (2) 熟悉不同继承方式下对基类成员的访问控制。 (3) 掌握继承的其他有关知识

二、实验题目(此部分必做): 1.题目1

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

b)定义一个基类BaseClass,有整型成员变量Number ,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。

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

实验提示:

(1) 编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示: error C2248:’age’:cannot access private member declared in class ‘Animal’ error C2248:’age’:cannot access private member declared in class ‘Animal’ 把age改为公有成员变量后重新编译就可以了。程序名为:lab7_1.cpp

(2)编写程序定义一个基类BassClass,构造其派生类DerivedClass,在构造函数和析构函数中用cout输出提示信息,观察构造函数和析构函数的执行情况。程序名为:lab7_2.cpp。用debug功能跟踪程序的执行过程,观察基类和派生类的构造函数和析构函数的执行情况。

(4) 写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车类(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名为:lab7_3.cpp。 编译成功后,把vehicle设置为非虚基类,再编译一次,此时系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。

2、定义一个大学生类student,函数私有数据成员:姓名、学号、校名,并为它定义带参数的构造函数、参数带缺省值的构造函数和输出数据成员值的print()公有成员函数,另定义研究生类,它以公有继承方式派生于类student,新增加“研究方向、导师名”两个私有数据成员,并定义带参数的构造函数和输出研究生数据的print()公有成员函数。在main()函数中定义基类和派生类对象,对类进行测试。

3、建立普通的基类building,用于存储一座楼房的层数、房间数和它的总平方面积。建立有派生类house,继承building,并存储卧室和浴室的数量。另建立派生类office,继承building,存储工作人员和电话的数目。设计程序,并测试上述三个类。 基类定义参考如下:

#include class Building {

int layernumber; int housenum; float sumarea; public:

Building();

Building(int m,int n,float s) { cout<<\ layernumber=m;housenum=n;sumarea=s; }

void print() { cout<<\ cout<<\ cout<<\ } };

参考测试程序: void main() {

Building build1(18,360,8000); build1.print();

House house(6,24,2880,4,2); house.print();

Office office(18,360,8000,4,4); office.print(); }

程序执行输出结果如下: base constructor called. this is a 18-story building there are 360 houses And total area is 8000 base constructor called. House constructer called. this is a 6-story building there are 24 houses And total area is 2880 bedroomnum=4 bathroomnum=2

base constructor called.

Office Constructor called. this is a 18-story building there are 360 houses And total area is 8000 stuffnum=4 telnum=4

4、题目2:从下图可以看出一个立方体Box可以视为是在一个矩形Rectangle的相互正交的长length和宽width的基础上增加一维与length和width相互正交的高height而生成的。Box的体积可以视为是由length和width确定的矩形面积沿正交轴在[0, height]区间进行积分获得的;Box的面积可以视为是由length和width确定的矩形周长沿正交轴在[0, height]区间进行积分的结果+两倍的矩形面积获得的。

Rectangle width length Box height width length

要求:

1.定义具有继承关系的矩形类Rectangle和立方体类Box。两个类中除了具有共同的 属性length和width,还具有相同的接口(公有成员函数)Area(计算矩形面积 或立方体面积),Perimeter(计算矩形周长或立方体周长),Diagonal(计算矩形 对角线或立方体对角线的长度),GetLength(获取长度属性),GetWidth(获取宽 度属性),SetLength(设置长度属性)和SetWidth(设置宽度属性)。除此之外, 立方体类Box还需要增加height属性和接口函数Volume(计算立方体的体积), GetHeight(获取高度属性)和SetHeight(设置高度属性)。

2. 在主函数main()中对矩形类Rectangle和立方体类Box进行如下测试: ①通过键盘输入长、宽和高,并以所输入的值创建3个Rectangle对象和1个Box 对象。

②通过上述对象分别计算并格式显示3个矩形和1个立方体的各项形态信息。矩 形的形态信息包括:长、宽、面积、周长和对角线;立方体的形态信息包括:长、 宽、高、体积、面积、周长和对角线。

③通过键盘输入新的长、宽和高,由并以所输入的值修改已创建的3个Rectangle 对象和1个Box对象的相应属性。

④重新分别计算并格式显示3个矩形和1个立方体的各项形态信息。 3. 要求编写编程文档,文档内容包括:

① 绘制Rectangle和Box类图,以及它们之间的静态关联图。 ② Rectangle和Box类的定义描述。

提示:立方体的周长定义为各棱长的和,立方体的对角线定义为立方体中不在同一矩形表面的两个顶点间的连线(矩形的对角线是不在同一边上的两个顶点间的连线)。

三、课外选作题

字典Dictionary是一个有由单词组成的集合。该集合中存放这些单词的结构可以有多

种,其中链表是一种较为简单和高效的结构。一个由存放单词的结点wordNode组成 的单词链表WordList与字典Dictionary之间的差异仅在于Dictionary中不允许有重 复单词的结点。其中存放单词的结点wordNode是构成字典的最基本数据单位,对结 点对象的访问是十分频繁的,因此可以将单词结点wordNode定义为如下的结构: struct wordNode { stringname; // 单词名。 Type type; // 单词类型包括名词noun、及物动词vt、不及物动词vi、

//形容词adj、副词adv、介词prep、代词pron、连词conj、 //数词num和感叹词inter),一个单词可以是单一类型或// 多类型。

MeanList *mean [10]; // 单词的全部含义描述。每个单词的每个词性都允许有多

//个含义描述。

wordNode *next; // 指向下一个单词结点。 wordNode() // 构造函数

{

for(int i = 0; i < 10; i++)

mean[i] = NULL; next = NULL; } ~wordNode() // 析构函数

{

for(int i = 0; i < 10; i++)

if(mean[i]) delete mean[i];

} };

wordNode的词名成员name是string类对象,该类的定义和功能已经在5.3题进行了详细说明(以下相同)。

wordNode的词性成员type的类型wordType可以定义为一个联合(union),便于 对单词类型的高效访问。该联合和联合中成员类型可以定义如下: struct sortType { unsigned noun: 1; // 名词类型 unsigned vt: 1; // 及物动词类型 unsigned vi: 1; // 不及物动词类型 unsigned adj: 1; // 形容词类型 unsigned adv: 1; // 副词类型 unsigned prep: 1; // 介词类型 unsigned pron: 1; // 代词类型 unsigned conj: 1; // 连接词类型 unsigned num: 1; // 数词类型 unsigned inter: 1; // 感叹词类型

本文来源:https://www.bwwdw.com/article/x858.html

Top