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

时间:2016-10-20 20:32:54

标签: c++ pointers vector dynamic-cast downcast

在我的一个类的构造函数中,我有这一行:

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

在同一课程的一个功能中,我有这一行:

m_Projects.push_back(local_project(TITLE, DEMO, FILE)); //local_project class derives from parent_project 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返回一个空值,但据我所知,由于m_Current是一个指向m_Projects的第一个元素的指针,因此我认为该转换是可行的,因为m_Projects是一个local_project对象。我想我可能会遗漏一些东西。

1 个答案:

答案 0 :(得分:2)

  

据我所知,由于m_Current ...是一个local_project对象,所以应该可以使用强制转换。

如果vector包含指向parent_project的指针,那么你所说的是真的。但是当它存储对象时,parent_project复制构造函数用于在容器中插入(local_project(TITLE, DEMO, FILE))时复制push_back对象,然后容器存储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_ptrshared_ptr

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