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

Saving an object of a derivated class in a std::list of an base c

本文关键字:std list 存在 派生 对象 保存      更新时间:2023-10-16

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

保留Y*列表。然后,您可以使用完整的虚拟功能分辨率,如果需要,您可以dynamic_cast(尽管我建议不要这样做)。

后者的原因是,通常有一个原因,为什么你保留一个Y列表而不是其他东西。

切片

之所以发生,是因为您有效地复制了列表中的元素(按值)。使用

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(无引用计数)的开销,实际上与原始指针一样快/小。