容器与继承
当使用容器存放继承体系中的对象时,通常必须采用间接存储的方式。
因为不允许在容器中保存不同类型的元素,所以不能把具有继承体系关系的多种类型的对象直接存放在容器当中。
当派生类对象被赋值给基类对象时,其中的派生类部分将被“切掉”,因此容器和存在继承关系的类型无法兼容。
在容器中放置(智能)指针而非对象
当希望在容器中存放具有继承关系的对线时,实际上存放的是基类的指针(更好的选择是智能指针),这些指针所指对象的动态类型可能是基类类型,也可能是派生类类型:
vector<Shared_ptr<Quote>> basket;
basket.push_back(make_shared<Quote>("0-201-8247-1"),50);
basket.push_back(make_shared<Bulk_quote>("0-201-54848-8",50,10,0.25));
cout << basket.back()->net_price(15) << endl;
basket 存放着 shared_ptr,解引用 basket.back() 的返回值以获得运行 net_price 的对象,通过在 net_price 的调用中使用 -> 以达到这个目的。
实际调用的 net_price 版本依赖于指针所指对象的动态类型。
可以将一个派生类的普通指针转换成基类指针,也能把一个派生类的普通指针转换成基类的智能指针。

浙公网安备 33010602011771号