Description
我们知道,目前我国的驾照大致可分为A、B、C三种,其中C证只能开小型客车(货车),B证可开中、小型客车(货车),A证没有限制。现在请定义如下几个类:
Automobile:抽象类,具有数据成员double speed,纯虚函数virtual void run() const = 0。
六种车型,即小型车Benz、Buick;中型车Zhongba、Beiqi;以及大型车Dayu、Jianghuai。它们都是Automobile的子类。
Driver类,具有string name和char type两个数据成员,前者是司机的名字,后者是司机持有的驾照类型(A、B或C)。提供Drive(Automobile *)方法,根据驾照类型判定该司机是否可以驾驶指定的汽车。
Input
输入分多行。第一行是一个整数M>0,表示之后有M个测试用例。
每个测试用例包括四部分:司机姓名(不含空白符)、驾照类型(A、B或C)、车型(分别用字母a~f表示六种车型,对应的车型可以从main()中看出)以及该车的行驶速度(double类型范围内的正数)。
Output
输出共M行,每个测试用例对应一行输入,具体格式参见样例。
Sample Input
4
zhangsan C a 100.33
lisi C d 100.33
wangwu B f 100.33
Tom A e 300.00
Sample Output
Driver zhangsan can drive Benz at speed of 100.33km/h.
A Benz is erased!
An automobile is erased!
Driver lisi cannot drive bus.
A Beiqi is erased!
An automobile is erased!
Driver wangwu cannot drive large bus.
A Jianghuai is erased!
An automobile is erased!
Driver Tom can drive Dayu at speed of 300.00km/h.
A Dayu is erased!
An automobile is erased!
HINT
1.使用typeid来判定一个基类指针实际指向的对象的类型。
2.注意:append.cc中已经给出了Driver类的一个方法,不要在Driver类重复定义了。
Append Code
append.cc,
void Driver::Drive(Automobile *automobile)
{
switch (type)
{
case 'A':
cout<<"Driver "<<name<<" can drive ";
automobile->run();
break;
case 'B':
if (typeid(*automobile) == typeid(Dayu) || typeid(*automobile) == typeid(Jianghuai))
cout<<"Driver "<<name<<" cannot drive large bus."<<endl;
else
{
cout<<"Driver "<<name<<" can drive ";
automobile->run();
}
break;
case 'C':
if (typeid(*automobile) != typeid(Benz) && typeid(*automobile) != typeid(Buick))
cout<<"Driver "<<name<<" cannot drive bus."<<endl;
else
{
cout<<"Driver "<<name<<" can drive ";
automobile->run();
}
break;
}
}
int main()
{
string name;
char type;
double speed;
char automobileType;
int cases;
Automobile *automobile;
cin>>cases;
for (int i = 0; i < cases; i++)
{
cin>>name>>type>>automobileType>>speed;
Driver driver(name, type);
switch (automobileType)
{
case 'a':
automobile = new Benz(speed);
break;
case 'b':
automobile = new Buick(speed);
break;
case 'c':
automobile = new Zhongba(speed);
break;
case 'd':
automobile = new Beiqi(speed);
break;
case 'e':
automobile = new Dayu(speed);
break;
case 'f':
automobile = new Jianghuai(speed);
break;
}
driver.Drive(automobile);
delete automobile;
}
return 0;
}
AC代码
#include <iostream>
#include <typeinfo>
#include <iomanip>
using namespace std;
class Automobile
{
protected:
double speed;
public:
Automobile(double sp=0):speed(sp){}
virtual void run() const = 0;
virtual ~Automobile(){cout<<"An automobile is erased!"<<endl;}
};
class Benz:public Automobile
{
public:
Benz(double sp=0):Automobile(sp){}
void run()const{cout<<"Benz at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Benz(){cout<<"A Benz is erased!"<<endl;}
};
class Buick:public Automobile
{
public:
Buick(double sp=0):Automobile(sp){}
void run()const{cout<<"Buick at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Buick(){cout<<"A Buick is erased!"<<endl;}
};
class Zhongba:public Automobile
{
public:
Zhongba(double sp=0):Automobile(sp){}
void run()const{cout<<"Zhongba at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Zhongba(){cout<<"A Zhongba is erased!"<<endl;}
};
class Beiqi:public Automobile
{
public:
Beiqi(double sp=0):Automobile(sp){}
void run()const{cout<<"Beiqi at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Beiqi(){cout<<"A Beiqi is erased!"<<endl;}
};
class Dayu:public Automobile
{
public:
Dayu(double sp=0):Automobile(sp){}
void run()const{cout<<"Dayu at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Dayu(){cout<<"A Dayu is erased!"<<endl;}
};
class Jianghuai:public Automobile
{
public:
Jianghuai(double sp=0):Automobile(sp){}
void run()const{cout<<"Jianghuai at speed of "<<setiosflags(ios::fixed)<<setprecision(2)<<speed<<"km/h."<<endl;}//这里的const忘记了;
~Jianghuai(){cout<<"A Jianghuai is erased!"<<endl;}
};
class Driver
{
protected:
string name;
char type;
public:
Driver(string na,char t):name(na),type(t){}
void Drive(Automobile*);//void不要忘记,与函数外声明相对应;
~Driver(){}
};
void Driver::Drive(Automobile *automobile)
{
switch (type)
{
case 'A':
cout<<"Driver "<<name<<" can drive ";
automobile->run();
break;
case 'B':
if (typeid(*automobile) == typeid(Dayu) || typeid(*automobile) == typeid(Jianghuai))
cout<<"Driver "<<name<<" cannot drive large bus."<<endl;
else
{
cout<<"Driver "<<name<<" can drive ";
automobile->run();
}
break;
case 'C':
if (typeid(*automobile) != typeid(Benz) && typeid(*automobile) != typeid(Buick))
cout<<"Driver "<<name<<" cannot drive bus."<<endl;
else
{
cout<<"Driver "<<name<<" can drive ";
automobile->run();
}
break;
}
}
int main()
{
string name;
char type;
double speed;
char automobileType;
int cases;
Automobile *automobile;
cin>>cases;
for (int i = 0; i < cases; i++)
{
cin>>name>>type>>automobileType>>speed;
Driver driver(name, type);
switch (automobileType)
{
case 'a':
automobile = new Benz(speed);
break;
case 'b':
automobile = new Buick(speed);
break;
case 'c':
automobile = new Zhongba(speed);
break;
case 'd':
automobile = new Beiqi(speed);
break;
case 'e':
automobile = new Dayu(speed);
break;
case 'f':
automobile = new Jianghuai(speed);
break;
}
driver.Drive(automobile);
delete automobile;
}
return 0;
}
1、注意下面的函数和虚函数形式保持一致,就算是const也不要少;
返回类型、参数类型一个都不能少;