当向容器加入对象时(pushback等),存入容器的是你所指定对象的副本。当从容器中取出一个对象时(front等),你所得到的是容器中所保存对象的副本。copy in。copy out。这就是STL的工作方式。这种复制是利用对象的复制成员函数实现的。如下:
class Widget{
public:
...
// 复制构造函数
Widget(const Widget&);
// 复制赋值操作符
Widget& operator=(const Widget&);
...
};
当存在继承关系的情况下,复制操作会导致剥离(slice)。如果你创建了一个存放基类对象的容器,却向其中插入了派生类的对象,那么派生类对象被复制到容器时(通过基类的复制构造函数),它所持有的派生类部分信息将会丢失:
vector<Widget> vw;
class SpecialWidget: public Widget
{
...
};
SpecialWidget sw;
vw.push_back(sw);
一个简单的办法是使容器包含指针而不是对象。也就是使用Widget*的容器,而不是使用Widget的容器。