代理类
面向对象编程主要关注继承、动态绑定。
继承是一种抽象,允许程序员可以在某种时刻忽略相似对象间的差异,又在其他时候利用这些差异
在将继承和容器共用时,需要处理的问题是:控制内存分配,把不同类型的对象放入同一个容器。
这时我们需要一个代理类,这个类的每个对象可以代理基类及其任何子类的对象,但这个代理类我们不想再写出多个子类,只一个基类就可以实现所有功能
class VehicleSurrogate
{
public
VehicleSurrogate();
VehicleSurrogate(const Vehicle&);
~VehicleSurrogate();
VehicleSurrogate(const VehicleSurrogate&);
VehicleSurrogate& operator=(const VehicleSurrogate&);
private:
Vehicle* vp;/定义一个基类指针成员变量
}
所有对代理的操作都转换为对基类指针的操作,所有需要调用方法都需要定义成virtual的,这样才可以通过基类的指针来调用。
基类定义一个copy()方法
virtual Vehicle* copy() const=0;
在子类中实现
Vehicle* Truck::copy() const
{
return new Truck(*this);
}
这个方法可以保证可以复制一个基类指针会真正复制一个子类对象。
VehicleSurrogate::VehicleSurrogate(const VehicleSurrogate& v) : vp(v.vp? vp->copy():0){}
这样定义了一个VehicleSurrogate这样的代理类后,我们可以这样定义一个停车场parking_lot,它是一个数组
VehicleSurrogate parking_lot[1000]
Automobile x;
parking_lot[num++] = x;或parking_lot[num++] = VehicleSurrogate(x);