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; }