我正在尝试保存X类的对象,该对象派生自std::list<Y>
中的基类Y. X类具有Y类没有的东西,当我保存对象std::list
时,会发生对象切片。有更多不同的类使用Y作为基础,因此为了简单起见,仅使用一个存储将是理想的,因为它们具有不同的成员,因此使用static_cast
没有按预期工作。这个问题有解决方法吗?或者我应该放弃它并为每种类型使用不同的容器?
答案 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
(没有引用计数)的开销,实际上与原始指针一样快/小。