前言:不同类型的对象,放进同一个容器。(下文以数组表示容器)
代理类
问题:
现有不同种类的交通工具类派生层次,如下:
classVehicle{ public: virtualdoubleweight()const=0; virtualvoidstart()=0; }; classAircraft:publicVehicle { }; classAutomobile:publicVehicle { };
我们想对一系列不同各类的Vehicle进行管理:
Vehicle parking_lot[1000];
不足:
抽象类不可实例化
若基类不是抽象类,类型转换会带来问题
经典解决方法:容器中存储基类指针
Vehicle* parking_lot[1000]; Automobile x; parking_lot[0] = &x;
不足:
内存管理的负担
若容器中的指针在其它地方被释放,会造成大量野指针
经典解决方法的改进:容器中的指针指向原对象的副本。
Vehicle* parking_lot[1000]; Automobile x; parking_lot[0] =newAutomobile(x);
不足:
动态内存管理的负担
需要知道对象x的静态类型
再次改进:虚复制函数