在单个列表中存储多个派生类类型

时间:2011-11-12 18:42:46

标签: c++ list

我想在单个stl列表中存储从同一基类派生的多个类类型。

如果我使用

list<BaseClass> L;

然后我添加任何派生类时我的代码编译得很好。但是,看起来我的派生类在存储之前会自动转换为基类型。显然,我也希望存储派生类型的唯一成员。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

你必须使用

list<BaseClass *> L;

但是有了这个,你就会遇到异常安全问题(当列表超出范围时你在哪里销毁对象?如果之前抛出了一些异常怎么办?)。也许这就是:

#include <list>
#include <tr1/memory>

std::list<std::tr1::shared_ptr<BaseClass> > L;

会更好。可以找到TR1基本信息,例如在wikipediadocumentation 在提升文档下。

答案 1 :(得分:1)

您需要将容器创建为list< Baseclass* >

list< Baseclass& >(第二个有点危险)。(&#34;删除&#34;感谢@Cat Plus Plus&#39;评论)

使用list< Baseclass >,您符合slicing issue

答案 2 :(得分:0)

为了做你想做的事,你必须使用指针。可能的解决方案是std::list<BaseClass*>,但现在您必须处理复制,克隆和删除。更好的选择是使用Boost.Pointer Containers,为您自动执行此操作。