试图向下转换 std::vector 中对象的指针

Trying to downcast pointer of object in std::vector

在我的 classes 之一的构造函数中,我有这一行:

m_Projects = std::vector<parent_project>(); //m_Projects type is std::vector<parent_project>
m_Current = nullptr; //m_Current type is parent_project*

在同样的函数中 class 我有这一行 :

m_Projects.push_back(local_project(TITLE, DEMO, FILE)); //local_project class derives from parent_project class.

在同一个 class 的第三个函数中,我有这些行:

m_Current = &m_Projects[0];

if (dynamic_cast<local_project*>(m_Current))

   SetCurrentProject(dynamic_cast<model::local_univariate::local_univariate_project*>(m_Current));

dynamic_cast returns 一个空值,但据我所知,强制转换应该有效,因为 m_Current 是指向 m_Projects 的第一个元素的指针,这是一个 local_project 对象。我想我可能遗漏了一些东西。

as I understand the cast would be supposed to work since m_Current ... is a local_project object.

如果 vector 包含指向 parent_project 的指针,那么您所说的就是正确的。但是当它存储对象时,parent_project 复制构造函数用于在容器中插入 (push_back) 时复制你的 local_project(TITLE, DEMO, FILE) 对象,然后容器存储一个 parent_project,而不是一个local_project。所以 m_Current 不再是 local_project...

您应该将 m_Projects 更改为 std::vector<parent_project*>。然后你的动态转换就可以了。

m_Projects.push_back(new local_project(TITLE, DEMO, FILE));

m_Current = m_Projects[0];

确保在清除容器时删除对象以避免内存泄漏。或者简单地使用 unique_ptr or shared_ptr.

如 Mark Ransom 所评论,请参阅 What is object slicing?