c++:实验七 继承与派生

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;
}
(2)程序执行结果
程序执行结果如下:
请输入停车位数量: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;
源.cpp

#include"Automobile.h"
#include"Park.h"
#include
#include
using namespace std;
int main()
{
	int N=0;
	cout << "请输入停车位数量:";
	cin >> N;// 输入停车位数量,此处输入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;
}

automobile.h

#include
#include"Park.h"
#include
using namespace std;
#ifndef AUTOMOBILE_H
#define AUTOMOBILE_H
class Park;
class automobile
{
private:
	string number;						//车牌号
	int money;							//停车费
	int place;							//汽车所在停车位
public:
	automobile(string number, int money);//构造函数
	automobile() {};					//无参构造函数
	int getMoney()
	{
		return money;
	}
	string getNumber()
	{
		return number;
	}
	virtual void pay()=0;				//纯虚函数
	void enter(Park& park);				//汽车驶入停车场
	void leave(Park& park);				//汽车离开停车场
};
#endif // !AUTOMOBILE_H
class Truck : public automobile				//派生类 卡车
{
private:
	double weight;
public:
	Truck(string number,double weight,int money=3) :		//派生类构造函数
		automobile(number,money), weight(weight) {};
	void pay()
	{
		cout << getNumber()<<weight;
		cout << getMoney();
	}
};
class Car : public automobile								//派生类汽车
{
private:
	string name;
public:
	Car(string number, string name, int money=1) :			//派生类的构造函数
		automobile(number,money), name(name){};
	void pay()
	{
		cout << getNumber() << name;
		cout << getMoney();
	}
};

class Bus : public automobile								//派生类 公交车
{
private:
	int people;
public:
	Bus(string number, int people, int money=2) :			//构造函数
		automobile(number,money), people(people) {};
	void pay()
	{
		cout << getNumber() << people;
		cout << getMoney();
	}
};

automobile.cpp

#include
#include"Park.h"
#include
using namespace std;
class Park;
automobile::automobile(string number, int money)//构造函数
{
	this->number = number;
	this->money = money;
	this->place = 0;							//默认为0
}
void automobile::enter(Park& park)				//汽车进入停车场
{
	for (int i = 0; i < park.N; i++)			//遍历停车场的停车位
		if (park.space[i] == 0)					//该停车位没有车
		{
			park.allCar++;			//停车场车辆数增加
			park.aut[i] = this;		//停车位
			park.space[i] = 1;		//表示已经听上车
			place = i;				//汽车所在停车位=i
			cout << park.aut[place]->getNumber() << "进入停车场,分配停车位" << endl;
			return;
		}
	cout << "无法为" << this->getNumber() << "分配车位" << endl;
}
void automobile::leave(Park& park)			//离开停车场
{
	park.allCar--;
	park.allMoney += money;				//缴纳停车费
	park.space[place] = 0;				//空出车位
	cout << park.aut[place]->getNumber() << "离开停车场,缴纳车费" << park.aut[place]->getMoney() << "元" << endl;
}

Park.h

#include"Automobile.h"
#include
#include
class automobile;
using namespace std;
#ifndef PARK_H
#define PARK_H
class Park
{
private:
public:
	automobile **aut;	//指向停车场某车位的车
	int N;				//车位总数(需要输入)
	int allMoney;		//停车场收入
	int allCar;			//停车场目前的车数
	bool *space;		//停车场某车位是否为空
	Park(int N);		
	~Park();
	void showInfo();
};
#endif // !PARK_H

Park.cpp

#include"Automobile.h"
#include
#include
class automobile;
Park::Park(int N) :N(N)//构造函数
{
	allMoney = 0;
	allCar = 0;
	aut = new automobile * [N];//析构函数要释放
	space = new bool[N];
	for (int i = 0; i < N; i++)
		space[i] = 0;
}
Park::~Park()
{
	delete[] aut;
	delete[] space;
}
void Park:: showInfo()
{
	cout << "停车场目前共停放了" << allCar << "辆车";
	if (allCar != 0)
	{
		cout << ":";
		for (int i = 0; i < N; i++)
			if (space[i] != 0)
				cout << aut[i]->getNumber() << ",";
	}
	else
		cout << ",";
	cout << "共收入" << allMoney << "元停车费" << endl;
}

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

你可能感兴趣的:(c/c++)