首页 > 解决方案 > 从强制转换的 std::shared_ptr 创建对象实例

问题描述

我有一个包含一组共享指针的向量:

std::vector<std::shared_ptr<Derived>> originalVector;

在某些时候它转换为Base共享指针,它看起来像:

std::vector<std::shared_ptr<Base>>* castedVector = reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

如何将Derived项目添加到铸造矢量?显然我可以在其中放置一个空std::shared_ptr,这个新的共享指针是否知道它所拥有的类型,它可以创建这种类型的对象吗?

更新:shared_ptr在转换为基类后无法创建原始对象。转换后,它丢失了有关原始基础类型的所有信息。此外:这reinterpret_cast是未定义的行为。

标签: c++c++11

解决方案


std::vector<std::shared_ptr<Base>>* castedVector =
    reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

这是未定义的行为,要这样做。

您可以通过复制而不是欺骗类型系统来创建vector指向 base 的指针:

std::vector<std::shared_ptr<Base>> baseVector(originalVector.begin(), originalVector.end());

这包含原始指针的副本,它们与它们共享所有权,但包含的指针Base*不是Derived*.

显然,如果你在其中插入一个新值originalVector,它就不会出现在 中baseVector,所以你需要制作一个整体的新副本originalVector,或者同时将它插入到两者中。


推荐阅读