在我的一个类的构造函数中,我有这一行:
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对象。我想我可能会遗漏一些东西。
答案 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_ptr或shared_ptr。
如Mark Ransom评论,请参阅What is object slicing?