前几天看的时候没看明白书里头说的对copy的调用都是虚调用的意思。我还理解成虚调用就相当于啥都没干,然后就百思不得其解了。难道是因为翻译的问题,可惜木有英文版,本来对照着看看
今天跑了下代码,其实就是说copy函数是个虚函数嘛,具体行为要看它实际的绑定对象是什么,就调用对应对象的copy函数。
surrogate(代理类)
Vehicle parking_lot[1000];
Automobile x=/**/
parking_lot[num_vehicles++]=x;
假设Vehicle是Authomobile的基类
会把x slicing(切片),把x转成Vehicle对象,丢失Vehicle类中没有的信息。
解决方案是存储指针,而不是对象本身。
Vehicle * parking_lot[1000];
Automobile x=/**/
parking_lot[num_vehicles++]=&x;
但也带来了问题,一旦x没有了,parking_lot就不知道指向什么东西了
变通一下使parking_lot指向原来的副本的指针
Automobile x=/**/
parking_lot[num_vehicles++]=new Automobile(x) ;
#include<iostream>
using namespace std;
class Vehicle
{
public:
virtual double weight() const = 0;
virtual void start() = 0;
virtual Vehicle* copy() const = 0;
};
class RoadVehicle:public Vehicle{
public:
double weight()const{return 1.0;}
void start(){cout<<"RoadVehicle start"<<endl; }
Vehicle *copy()const{return new RoadVehicle(*this);}
};
class AutoVehicle : public Vehicle
{
public:
double weight() const { return 2.0; }
void start() { cout<<"Automobile start"<<endl; }
Vehicle* copy() const { return new AutoVehicle(*this); }
};
class Aircraft : public Vehicle
{
public:
double weight() const { return 3.0; }
void start() { cout<<"Aircraft start"<<endl; }
Vehicle* copy() const { return new Aircraft(*this); }
};
class Helicopter : public Vehicle
{
public:
double weight() const { return 4.0; }
void start() { cout<<"Helicopter start"<<endl; }
Vehicle* copy() const { return new Helicopter(*this); }
};
class VehicleSurrogate
{
public:
VehicleSurrogate() : vp(0) {}
VehicleSurrogate(const Vehicle& v) : vp(v.copy()) {}
VehicleSurrogate(const VehicleSurrogate& v)
{
vp = (v.vp ? v.vp->copy() : 0);
}
VehicleSurrogate& operator= (const VehicleSurrogate& v)
{
if (this != &v)
{
delete vp;
vp = (v.vp ? v.vp->copy() : 0);
}
return *this;
}
~VehicleSurrogate() { delete vp; }
private:
Vehicle *vp;
};
int main()
{
VehicleSurrogate parking_lot[1000];
AutoVehicle v;
parking_lot[0] = v;//该句等价于下句
parking_lot[0] =VehicleSurrogate(v);
}