如何从 shared_ptr 获取具体的 class 对象到抽象的 class 对象

how to get concrete class object from shared_ptr to abstract class objects

我有 shared_ptrs 的向量到派生自抽象 class

的对象
std::vector<std::shared_ptr<Abstract>> objects;

以下失败:

Concrete* c = objects[0].get()

有:

error: invalid conversion from ‘Abstract*’ to ‘Concrete*

如何访问具体类型的对象

如果您必须获得指向派生 class 的指针,请使用 dynamic_cast

Concrete* c = dynamic_cast<Concrete*>(objects[0].get());
if ( c != nullptr )
{
    // Use c
}

如果你只需要访问一个成员函数或成员变量而不是指针本身,你可以使用std::dynamic_pointer_cast.

auto cptr = std::static_pointer_cast<Concrete>(objects[0]);
if ( cptr )
{
   // Use cptr
}

使用 std::dynamic_pointer_cast 也具有与通常使用智能指针相同的好处。