我有一个向量,其中包含一组共享指针:
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
是未定义的行为。
答案 0 :(得分:0)
您应该能够将派生类指针添加到基类指针的向量。然后将派生的指针转换为基本指针。这有点与智能指针的功能无关。将向量创建为基础元素的向量还是将其转换为基本元素都没有关系,
std::vector<std::shared_ptr<Base>> bases;
// Create a Derived instance
auto derived = std::make_shared<Derived>();
bases.push_back(derived);
// Only create a pointer (might as well just create a Base pointer)
std::shared_ptr<Derived> emptyPointer;
bases.push_back(emptyPointer)
答案 1 :(得分:0)
std::vector<std::shared_ptr<Base>>* castedVector =
reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);
这是不确定的行为,请不执行此操作。
您可以通过复制而不是躺在类型系统上来创建指向基础的指针vector
:
std::vector<std::shared_ptr<Base>> baseVector(originalVector.begin(), originalVector.end());
这包含原始指针的副本,这些副本与它们共享所有权,但是所包含的指针是Base*
而不是Derived*
。
很显然,如果您在originalVector
中插入新值,则不会在baseVector
中插入,因此您需要制作整个originalVector
的新副本或将其插入同时进入两者。