题目要求
现在要开发一个系统,管理对多种汽车的收费工作。
给出下面的一个基类框架
class Vehicle
{
protected:
string NO;//编号
public:
virtual void display()=0;//输出应收费用
}
以Vehicle为基类,构建出Car、Truck和Bus三个类。
Car的收费公式为: 载客数8+重量2
Truck的收费公式为:重量*5
Bus的收费公式为: 载客数*3
生成上述类并编写主函数,要求主函数中有一个基类Vehicle指针数组,数组元素不超过10个。
Vehicle *pv[10];
主函数根据输入的信息,相应建立Car,Truck或Bus类对象,对于Car给出载客数和重量,Truck给出重量,Bus给出载客数。假设载客数和重量均为整数
输入格式:每个测试用例占一行,每行给出汽车的基本信息,每一个为当前汽车的类型1为car,2为Truck,3为Bus。接下来为它的编号,接下来Car是载客数和重量,Truck给出重量,Bus给出载客数。最后一行为0,表示输入的结束。
要求输出各车的编号和收费。
提示:应用虚函数实现多态
输入样例
1 002 20 5
3 009 30
2 003 50
1 010 17 6
0
输出样例
002 170
009 90
003 250
010 148
解题思路
定义一个名为 Vehicle
的抽象类作为父类,包含虚函数display()
,用于在子类中实现应缴费用的输出。
定义 Car
、Truck
、Bus
三个子类,它们分别继承自 Vehicle
父类,并实现了各自的 display() 函数。
在主函数中
-
首先定义了一个指向 Vehicle 类指针的数组 pd,用于存放类的对象指针地址。
-
接着使用循环读取车辆信息,根据不同类型的车辆输入不同的参数,创建相应的对象并将指针地址保存到数组中。每次创建完对象就调用其 display() 函数输出应缴费用。
代码
#include <iostream>
#include <string>
using namespace std;
typedef long long ll; // 定义 long long 类型别名
// 定义 Vehicle 父类
class Vehicle {
protected:
string NO; // 车牌号
public:
// 构造函数
Vehicle(string str) {
NO = str;
}
// 抽象虚函数,子类必须实现
virtual void display() = 0; // 显示应收费用
// 虚析构函数,确保子类析构时能够调用到自己的析构函数
virtual ~Vehicle() {};
};
// 定义 Car 子类
class Car : public Vehicle {
int n; // 车位数
double k; // 额外重量(吨)
public:
// 构造函数
Car(string str, int num, double kg) : Vehicle(str) {
n = num;
k = kg;
}
// 实现父类抽象虚函数,显示应收费用
virtual void display() {
cout << NO << " " << n * 8 + k * 2 << endl; // 输出车辆的编号、应缴费用
}
};
// 定义 Truck 子类
class Truck : public Vehicle {
double k; // 货车货物重量(吨)
public:
// 构造函数
Truck(string str, double kg) : Vehicle(str) {
k = kg;
}
// 实现父类抽象虚函数,显示应收费用
virtual void display() {
cout << NO << " " << k * 5 << endl; // 输出车辆的编号、应缴费用
}
};
// 定义 Bus 子类
class Bus : public Vehicle {
int n; // 车位数
public:
// 构造函数
Bus(string str, int num) : Vehicle(str) {
n = num;
}
// 实现父类抽象虚函数,显示应收费用
virtual void display() {
cout << NO << " " << n * 3 << endl; // 输出车辆的编号、应缴费用
}
};
// 主函数
int main() {
Vehicle *pd[10]; // 定义存放类指针的数组
string str; // 定义字符串变量
int t, num, i = 0; // 定义整数变量和计数器
double kg; // 定义浮点数变量
cin >> t; // 输入车辆数量
while (t) { // 循环读取车辆信息
cin >> str; // 输入车牌号
if (t == 1) { // 如果是小汽车
cin >> num >> kg; // 输入车位数和额外重量
pd[i] = new Car(str, num, kg); // 创建 Car 类型对象,并保存指针地址到数组中
}
else if (t == 2) { // 如果是货车
cin >> kg; // 输入货物重量
pd[i] = new Truck(str, kg); // 创建 Truck 类型对象,并保存指针地址到数组中
}
else if (t == 3) { // 如果是公交车
cin >> num; // 输入车位数
pd[i] = new Bus(str, num); // 创建 Bus 类型对象,并保存指针地址到数组中
}
pd[i]->display(); // 调用虚函数,显示应收费用
i++; // 计数器增加 1
cin >> t; // 继续输入下一个车辆的类型
}
delete *pd; // 释放内存
return 0; // 返回 0,程序结束
}
总结
该题考察纯虚函数的声明和实现
、多态性的应用
以及指针的操作
等。同时也考察了基本的控制结构
、数据类型
。
我是秋说,我们下次见。
标签:函数,Bus,Vehicle,C++,Truck,PTA,str,Car,收费 From: https://www.cnblogs.com/qiushuo/p/17481449.html