将派生类的对象保存在基本c的std :: list中

时间:2015-04-09 21:41:03

标签: c++ class inheritance stdlist

我正在尝试保存X类的对象,该对象派生自std::list<Y>中的基类Y. X类具有Y类没有的东西,当我保存对象std::list时,会发生对象切片。有更多不同的类使用Y作为基础,因此为了简单起见,仅使用一个存储将是理想的,因为它们具有不同的成员,因此使用static_cast没有按预期工作。这个问题有解决方法吗?或者我应该放弃它并为每种类型使用不同的容器?

2 个答案:

答案 0 :(得分:0)

保留Y*的列表。然后你可以随时使用完整的虚拟功能解析,如果需要,你可以dynamic_cast(尽管我会反对这一点)。

后者的原因在于,通常有一个理由可以保留Y列表而不是其他内容。

答案 1 :(得分:0)

发生

Slicing是因为您有效地复制了列表中的元素(按值)。使用

std::list<std::unique_ptr<Y>> 

或者,如果您需要共享所有权,

std::list<std::shared_ptr<Y>> 
而不是(并且更好地交换名称X和Y,因为通常Y是从X派生的)。

如果您不需要共享所有权,则应使用std::unique_ptr,在这种情况下,请确保std::move您的元素进出列表。 std::unique_ptr没有std::shared_ptr(没有引用计数)的开销,实际上与原始指针一样快/小。