题目要求
现在要开发一个系统,管理对多种汽车的收费工作。
给出下面的一个基类框架
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,程序结束 }
总结
该题考察纯虚函数的声明和实现
、多态性的应用
以及指针的操作
等。同时也考察了基本的控制结构
、数据类型
。
我是秋说,我们下次见。