不同交通工具的速度

Description

不同交通工具的速度是不同的。针对自行车、摩托车和汽车分别建立类,来模拟这一情况。

定义Vechicle类,是所有交通工具的父类:

  1. 属性int speed表示交通工具的一般速度。

  2. 静态数据成员int numOfVechicles,表示创建的交通工具的数量。这个值只增不减。

  3. 静态成员函数int getNumOfVechicles(),用于获取交通工具的数量。

  4. 析构函数。输出“A vechicle is deleted.”

  5. 纯虚函数void show().

定义Bike、MotoBike和Car三个类,它们都是Vechicle的子类,且具有:

  1. 构造函数。

  2. 重写show()函数,输出“A *'s speed is ? km/h.”,其中“*”是bike、motobike或car,根据所在类不同而不同。“?”是speed属性的值。

  3. 析构函数。输出“A * is deleted.”,“*”的含义同上。

定义Person类,表示司机:

  1. 数据成员string name,是人的姓名。

  2. void drive(Vechicle&)方法,输出“$ drives”, 并调用Vechicle类的show()方法。其中“$”是name的值。

Input

第1行N>0,表示有N个测试用例。

每个测试用例包括一个不含空白符的字符串、一个字符和一个整数。

Output

见样例及题目描述。

Sample Input
3
Tom B 15
Jack M 50
Mary C 100
Sample Output
In beginning, we have 0 vechicles.
Tom drives. A bike’s speed is 15km/h.
A bike is deleted.
A vechicle is deleted.
Jack drives. A motobike’s speed is 50km/h.
A motobike is deleted.
A vechicle is deleted.
Mary drives. A car’s speed is 100km/h.
A car is deleted.
A vechicle is deleted.
At the end, we have 3 vechicles.
HINT

Append Code
append.cc,

int main()
{
    int cases, n;
    char c;
    string name;
    Vechicle* vechicle;
    cout<<"In beginning, we have "<<Vechicle::getNumOfVechicles()<<" vechicles."<<endl;
    cin>>cases;
    for (int i = 0; i < cases; i++)
    {
        cin>>name>>c>>n;
        Person person(name);
        switch (c)
        {
        case 'B':
            vechicle = new Bike(n);
            break;
        case 'M':
            vechicle = new MotoBike(n);
            break;
        case 'C':
            vechicle = new Car(n);
            break;
        }
        person.drive(*vechicle);
        delete vechicle;
    }
    cout<<"At the end, we have "<<Vechicle::getNumOfVechicles()<<" vechicles."<<endl;
    return 0;
}

AC代码

#include <iostream>

using namespace std;
class Vechicle
{
protected:
    int speed;
    static int numOfVechicles;
public:
    Vechicle(int sp=0):speed(sp){++numOfVechicles;}
    virtual void show()=0;
    virtual ~Vechicle(){cout<<"A vechicle is deleted."<<endl;}
    static int getNumOfVechicles(){return numOfVechicles;}
};
int Vechicle::numOfVechicles=0;
class Person
{
protected:
    string name;
public:
    Person(string na=""):name(na){}
    void drive(Vechicle& p){cout<<name<<" drives. ";p.show();}//刚开始一直没有明白"并调用Vechicle类的show()方法",这里是什么意思;
};
class Bike:public Vechicle
{
public:
    Bike(int sp=0):Vechicle(sp){}//总是忘记在子类中给直接基类赋值;而且后面给父类赋值的形式总是出错,写成speed(sp);
    ~Bike(){cout<<"A bike is deleted."<<endl;}
    void show(){cout<<"A bike's speed is "<<speed<<"km/h."<<endl;}
};
class MotoBike:public Vechicle
{
public:
    MotoBike(int sp=0):Vechicle(sp){}
    ~MotoBike(){cout<<"A motobike is deleted."<<endl;}
    void show(){cout<<"A motobike's speed is "<<speed<<"km/h."<<endl;}
};
class Car:public Vechicle
{
public:
    Car(int sp=0):Vechicle(sp){}
    ~Car(){cout<<"A car is deleted."<<endl;}
    void show(){cout<<"A car's speed is "<<speed<<"km/h."<<endl;}
};
int main()
{
    int cases, n;
    char c;
    string name;
    Vechicle* vechicle;
    cout<<"In beginning, we have "<<Vechicle::getNumOfVechicles()<<" vechicles."<<endl;
    cin>>cases;
    for (int i = 0; i < cases; i++)
    {
        cin>>name>>c>>n;
        Person person(name);
        switch (c)
        {
        case 'B':
            vechicle = new Bike(n);
            break;
        case 'M':
            vechicle = new MotoBike(n);
            break;
        case 'C':
            vechicle = new Car(n);
            break;
        }
        person.drive(*vechicle);
        delete vechicle;
    }
    cout<<"At the end, we have "<<Vechicle::getNumOfVechicles()<<" vechicles."<<endl;
    return 0;
}

1、在类外给静态成员赋初值的写法;
2、总是忘记在子类中给直接基类赋值;而且后面给父类赋值的形式总是出错,写成speed(sp);
3、刚开始一直没有明白”并调用Vechicle类的show()方法”,这里是什么意思;

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/80207196
今日推荐