class Vehicle
{
public:
virtual double Weight() const = 0;
virtual void Start() = 0;
//【3】
//存储就肯定得有复制,但是我们不知道派生类的类型,我们无法自己进行复制
//一个比较好的方法就是用多态的机制,让派生类自己进行复制,然后通过返回值的形式进行传递
//我们叫虚复制函数
virtual Vehicle* copy() const = 0;
// ...
};
class RoadVehicle: public Vehicle
{
public:
double Weight() const { return 1.0; }
void Start() {}
//【4】
//定义RoadVehicle类的copy函数
Vehicle* copy() const
{
return new RoadVehicle(*this);
}
/*
...
*/
};
class Automobile: public Vehicle
{
public:
double Weight() const { return 1.0; }
void Start() {}
//【5】
//定义Automobile类的copy函数
Vehicle* copy() const
{
return new Automobile(*this);
}
/*
...
*/
};
//【2】
//我们可以通过定义一个新的类,叫做Vehicle的代理类,来执行【1】中的情况
//代理类有能力让Vehicle的派生类存放在同一个容器中,而不必知道派生类的类型
class VehicleSurrogate
{
public:
//【7】
//构造函数和赋值操作符的定义
VehicleSurrogate():_v(0) {}
VehicleSurrogate(const Vehicle& v):_v(v.copy()) {}
~VehicleSurrogate() { delete _v; }
VehicleSurrogate(const VehicleSurrogate& v):_v(v._v ? v._v->copy() : 0) {}
VehicleSurrogate& operator=(const VehicleSurrogate& v)
{
if(this != &v)
{
delete _v;
_v = (v._v ? v._v->copy() : 0);
}
return *this;
}
//【8】
//定义所代理的对象的操作
double Weight() const
{
if(_v != 0)
return _v->Weight();
}
void Start()
{
if(_v != 0)
_v->Start();
}
private:
//【6】
//一个代理类,当然包含所代理对象的内容
Vehicle* _v;
};
int main()
{
//【1】
/*想定义一个Vehicle数组,保存各种交通工具的停车情况*/
Vehicle parking_lot[1024];
//上面的语句通不过编译,提示是:cannot instantiate abstract class
//那是因为Vehicle有两个纯虚函数,不能过实例化
//【9】
//现在可以用代理类来存放Vehicle的派生类了
VehicleSurrogate parking_lot1[1024];
Automobile x;
parking_lot1[0] = x;
return 0;
}