C++实验7 继承与派生

实验七 继承与派生

1 实验目的

学习继承与派生的相关理论,熟悉不同继承方式下对基类成员的访问方式,包括以下几个方面:
(1)学习声明和使用类的继承关系,声明派生类;
(2)熟悉不同继承方式下,对基类成员的访问控制;

2 实验内容

2.1 停车场程序

(1)问题描述

请根据题目要求完成简单的停车场管理程序。
1.停车场(Park)有 N 个停车位(space),每个停车位可以停放不同类型的
汽车(Automobile),包括卡车(Truck)、轿车(Car)、公交车(Bus),但同一时刻一个停车位只能停放 0 或 1 辆汽车。如果没有空余停车位,显示提示信息,但不会为车辆安排停车位。
2.程序模拟车辆停车的情况:新来车辆时如果有空位,按顺序为该车分配停车位;车辆开走时,应交纳停车费。
3.停车场可以显示当前停放的车辆的车牌号码,以及当前的全部停车费收入(income)。
4.定义汽车基类 Automobile,包括车牌号码(字符串)成员数据。
5.定义派生类 Truck、Car、Bus。这些车辆除了拥有车牌号码之外,还各自
拥有不同的属性。Truck 还包括载重量属性(浮点数,单位吨);Car 还拥有品牌属性(字符串),Bus 还包括核定载员数量(整型)。此外,每个派生类中要实现 pay()函数,用于显示车辆信息并交纳停车费。其中,Truck 收费 3 元/次,Car 收费 1 元/次,Bus 收费 2 元/次。

(2)问题要求

编写程序,测试上述所要求的各种功能。要求创建新的工程项目 ParkManager,
添加必要的源文件和头文件,并在程序适当的位置中编写注释。

class Automobile {}; // 汽车类
class Park {}; // 停车场类
int main() {
cout << "请输入停车位数量:";
cin >> N;// 输入停车位数量,此处输入2
Park *park = new Park(N);// 创建一个停车场对象
Car car1("鲁B-12345","奥迪A6"); // 创建轿车对象
car1.enter(park); // car1进入停车场,分配停车位
Truck truck("鲁B-23456", 15); // 创建卡车对象
truck.enter(park); // truck进入停车场,分配车位
car1.leave(park); // car1离开停车场,缴纳停车费
Bus bus("鲁B-34567", 50); // 创建公交车对象
bus.enter(park); // bus进入停车场,分配车位
/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
park->showInfo();
Car car2("鲁B-45678","宝马320"); // 创建轿车对象
car2.enter(park); 
// car2进入停车场,分配停车位。因为没有空余停车位,所以无法分配
bus.leave(park); // bus离开停车场,缴纳停车费
truck.leave(park); // truck离开停车场,缴纳停车费
/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
park->showInfo();
delete park;
return 0;
} 
(3)程序执行结果

程序执行结果如下:
请输入停车位数量:2 鲁B-12345进入停车场,分配停车位
鲁B-23456进入停车场,分配停车位
鲁B-12345离开停车场,缴纳停车费1元
鲁B-34567进入停车场,分配停车位
停车场目前停放了2辆汽车:鲁B-23456,鲁B-34567,共收入1元停车费
无法为鲁B-45678分配停车位
鲁B-34567离开停车场,缴纳停车费2元
鲁B-23456离开停车场,缴纳停车费3元
停车场目前停放了0辆汽车,共收入6元停车费

提示:停车场的停车位要用Automobile的指针数组表示。

Automobile **spaces;
spaces = new Automobile*[N];
spaces[i] = &car1;
delete[] spaces;

源代码

#include <iostream>
#include <string>

using namespace std;

class Automobile;

class Park {
public:
	Park(int N);
	~Park();
	void showInfo();
	bool assignSpace(Automobile *pa);
	bool reclaimSpace(Automobile *pa, int fee);
private:
	Automobile **spaces;
	int income;
	int N;
	int numAuto;
};

class Automobile {
public:
	Automobile(string plateNO);
	void enter(Park &park);
	void leave(Park &park);
	string getPlateNO();

protected:
	string plateNO;
};

Park::Park(int N) {
	spaces = new Automobile*[N];
	for (int i = 0; i < N; i++)
		spaces[i] = NULL;
	income = 0;
	this->N = N;
	numAuto = 0;
}

Park::~Park() {
	delete[] spaces;
}

void Park::showInfo() {
	if (numAuto == 0)
		cout << "停车场目前停放了" << numAuto << "辆汽车,共收入" << income << "元停车费";
	else {
		cout << "停车场目前停放了" << numAuto << "辆汽车:";
		for (int i = 0; i < N; i++)
			if (spaces[i] != NULL)
				cout << spaces[i]->getPlateNO() << ",";

		cout << "共收入" << income << "元停车费" << endl;
	}
}

bool Park::assignSpace(Automobile *pa) {
	for (int i = 0; i < N; i++) {
		if (spaces[i] == NULL) {
			spaces[i] = pa;
			numAuto++;
			cout << pa->getPlateNO() << "进入停车场,分配停车位" << endl;
			return true;
		}
	}
	cout << "无法为" << pa->getPlateNO() << "分配停车位" << endl;
	return false;
}

bool Park::reclaimSpace(Automobile *pa, int fee) {
	for (int i = 0; i < N; i++) {
		if (spaces[i] == pa) {
			spaces[i] = NULL;
			numAuto--;
			income += fee;
			cout << pa->getPlateNO() << "离开停车场,缴纳停车费" << fee << "元" << endl;
			return true;
		}
	}
	cout << "停车场中没有车牌为" << pa->getPlateNO() << "的汽车";
	return false;
}

Automobile::Automobile(string plateNO) :
		plateNO(plateNO) {
}

void Automobile::enter(Park &park) {
	park.assignSpace(this);
}

void Automobile::leave(Park &park) {

}

string Automobile::getPlateNO() {
	return plateNO;
}

class Truck: public Automobile {
public:
	Truck(string plateNO, double capacity) :
			Automobile(plateNO), capacity(capacity) {
	}
	void leave(Park &park);
protected:
	double capacity;
};

void Truck::leave(Park &park) {
	park.reclaimSpace(this, 3);
}

class Car: public Automobile {
public:
	Car(string plateNO, string brand) :
			Automobile(plateNO), brand(brand) {
	}
	void leave(Park &park);
protected:
	string brand;
};

void Car::leave(Park &park) {
	park.reclaimSpace(this, 1);
}

class Bus: public Automobile {
public:
	Bus(string plateNO, int numPassengers) :
			Automobile(plateNO), numPassengers(numPassengers) {
	}
	void leave(Park &park);
protected:
	int numPassengers;
};

void Bus::leave(Park &park) {
	park.reclaimSpace(this, 2);
}

int main() {
	int N = 0;
	cout << "请输入停车位数量:";
	cin >> N; // 输入停b车位数量,此处输入2

	Park park(N); // 创建一个停车场对象

	Car car1("鲁B-12345", "奥迪A6"); // 创建轿车对象
	car1.enter(park); // car1进入停车场,分配停车位

	Truck truck("鲁B-23456", 15); // 创建卡车对象
	truck.enter(park); // truck进入停车场,分配车位

	car1.leave(park); // car1离开停车场,缴纳停车费

	Bus bus("鲁B-34567", 50); // 创建公交车对象
	bus.enter(park); // bus进入停车场,分配车位

	/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
	park.showInfo();

	Car car2("鲁B-45678", "宝马320"); // 创建轿车对象
	car2.enter(park);
	// car2进入停车场,分配停车位。因为没有空余停车位,所以无法分配

	bus.leave(park); // bus离开停车场,缴纳停车费
	truck.leave(park); // truck离开停车场,缴纳停车费

	/* 显示当前停放的车辆的车牌号码,以及当前的全部停车费收入*/
	park.showInfo();

	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值