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

Storing multiple derived class types in a single list

本文关键字:派生 类型 存储 单个 列表      更新时间:2023-10-16

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

如果我使用

list<BaseClass> L;

那么当我添加任何派生类时,我的代码编译得很好。然而,看起来我的派生类在被存储之前被自动转换为基类型。显然,我也想存储派生类型的唯一成员。我该怎么做呢?

你必须使用

list<BaseClass *> L;

但是这样的话,你就会遇到异常安全的问题(当列表超出作用域时,你在哪里销毁对象?如果之前抛出了异常怎么办?)。也许是这样:

#include <list>
#include <tr1/memory>
std::list<std::tr1::shared_ptr<BaseClass> > L;

更好。TR1的基本信息可以在维基百科上找到,比如它的文档

您需要创建的容器名称为list< Baseclass* >

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

通过使用list< Baseclass >,您可以满足切片问题

为了做你想做的事,你必须使用指针。一个可能的解决方案是std::list<BaseClass*>,但是现在您必须处理复制、克隆和删除。更好的选择是使用Boost。指针容器,它会自动为你做这些