我想在单个stl列表中存储从同一基类派生的多个类类型。
如果我使用
list<BaseClass> L;
然后我添加任何派生类时我的代码编译得很好。但是,看起来我的派生类在存储之前会自动转换为基类型。显然,我也希望存储派生类型的唯一成员。我怎么能这样做?
答案 0 :(得分:4)
你必须使用
list<BaseClass *> L;
但是有了这个,你就会遇到异常安全问题(当列表超出范围时你在哪里销毁对象?如果之前抛出了一些异常怎么办?)。也许这就是:
#include <list>
#include <tr1/memory>
std::list<std::tr1::shared_ptr<BaseClass> > L;
会更好。可以找到TR1基本信息,例如在wikipedia,documentation 在提升文档下。
答案 1 :(得分:1)
您需要将容器创建为list< Baseclass* >
或(&#34;删除&#34;感谢@Cat Plus Plus&#39;评论)list< Baseclass& >
(第二个有点危险)。
使用list< Baseclass >
,您符合slicing issue。
答案 2 :(得分:0)
为了做你想做的事,你必须使用指针。可能的解决方案是std::list<BaseClass*>
,但现在您必须处理复制,克隆和删除。更好的选择是使用Boost.Pointer Containers,为您自动执行此操作。