Description
定义Vehicle类,包括:
1. 一个int类型属性num,表示汽车的轮子数量。
2. 构造函数、析构函数,输出如样例所示的信息。
定义Bus类,是Vehicle类的子类,包括:
1. 一个int类型属性guest,表示客车可乘坐的人数。
2. 构造函数、析构函数,输出如样例所示的信息。
定义Truck类,是Vehicle类的子类,包括:
1. 一个int类型属性weight,表示货车可载荷的货物重量。
2. 构造函数、析构函数,输出如样例所示的信息。
Input
输入有多行,每行一个测试用例,每行包括1个正整数(车的轮子数量)、1个字符b或者t(b、t分别表示客车、货车)、1个正整数(可乘坐的人数或可承载的货物重量)。
Output
见样例。
Sample Input
4 b 40
8 t 15
Sample Output
Vehicle has 4 wheels is created.
Bus which can carry 40 persons is created.
Bus which can carry 40 persons is erased.
Vehicle has 4 wheels is erased.
Vehicle has 8 wheels is created.
Truck which can carry 15 tons goods is created.
Truck which can carry 15 tons goods is created.
Vehicle has 8 wheels is erased.
HINT
Append Code
append.cc,
int main()
{
int w, g;
char t;
Vehicle *veh;
while (cin>>w>>t>>g)
{
if (t == 'b')
{
veh = new Bus(w, g);
}
else
{
veh = new Truck(w, g);
}
delete veh;
}
return 0;
}
AC代码
#include <iostream>
using namespace std;
class Vehicle
{
private:
int num;
public:
Vehicle(int i=0):num(i){cout<<"Vehicle has "<<num<<" wheels is created."<<endl;}
virtual ~Vehicle(){cout<<"Vehicle has "<<num<<" wheels is erased."<<endl;}
};
class Bus:public Vehicle
{
private:
int guest;
public:
Bus(int w=0,int g=0):Vehicle(w),guest(g){cout<<"Bus which can carry "<<guest<<" persons is created."<<endl;}
~Bus(){cout<<"Bus which can carry "<<guest<<" persons is erased."<<endl;}
};
class Truck:public Vehicle
{
private:
int weight;
public:
Truck(int w=0,int g=0):Vehicle(w),weight(g){cout<<"Truck which can carry "<<g<<" tons goods is created."<<endl;}
~Truck(){cout<<"Truck which can carry "<<weight<<" tons goods is created."<<endl;}
};
int main()
{
int w, g;
char t;
Vehicle *veh;
while (cin>>w>>t>>g)
{
if (t == 'b')
{
veh = new Bus(w, g);
}
else
{
veh = new Truck(w, g);
}
delete veh;
}
return 0;
}
1、对于虚拟析构函数的用法
(一)虚析构函数的作用
总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的.
(二)总结虚析构函数的作用:
(1)如果父类的析构函数不加virtual关键字
当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
(2)如果父类的析构函数加virtual关键字
当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
因此:
只需要在父类中用虚拟析构就可以了,之后的都会在析构的时候自动调用父类的虚拟析构;
2、为什么在析构的时候只有父类的析构,没有子类的析构呢?
因为指针是父类的指针,当删除指针的时候只会调用父类的析构函数;
3、这里无参初始化的时候为什么没有输出呢?
Vehicle(int i=0):num(i){cout<<"Vehicle has "<<num<<" wheels is created."<<endl;}
// Vehicle():num(0){}
// Vehicle(int i):num(i){cout<<"Vehicle has "<<num<<" wheels is created."<<endl;}
是因为定义的是指针,而且是动态的指针,所以刚开始还没有分配空间,因此不会初始化。
由此可得最上面的写法和下面注释掉的写法是一样的;