我有从抽象类派生的对象的shared_ptrs向量
std::vector<std::shared_ptr<Abstract>> objects;
以下操作失败:
Concrete* c = objects[0].get()
跟:
error: invalid conversion from ‘Abstract*’ to ‘Concrete*
如何访问具体类型的对象
如果必须获取指向派生类的指针,请使用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
也具有与使用智能指针时相同的好处。