`
mooncui
  • 浏览: 71230 次
社区版块
存档分类
最新评论

《C++沉思录》笔记---代理类

    博客分类:
  • C++
阅读更多

代理类
面向对象编程主要关注继承、动态绑定。
继承是一种抽象,允许程序员可以在某种时刻忽略相似对象间的差异,又在其他时候利用这些差异
在将继承和容器共用时,需要处理的问题是:控制内存分配,把不同类型的对象放入同一个容器。
这时我们需要一个代理类,这个类的每个对象可以代理基类及其任何子类的对象,但这个代理类我们不想再写出多个子类,只一个基类就可以实现所有功能
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);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics