C++ 尝试向下转换std::vector中对象的指针

C++ 尝试向下转换std::vector中对象的指针,c++,pointers,vector,dynamic-cast,downcast,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_proj

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

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));
m_Current=&m_项目[0];
if(动态_投射(m_当前))
SetCurrentProject(动态_cast(m_Current));
dynamic_cast返回一个空值,但据我所知,cast应该可以工作,因为m_Current是指向m_项目的第一个元素的指针,这是一个本地_项目对象。我想我可能错过了什么

据我所知,演员阵容应该在m_Current。。。是本地_项目对象

如果
向量
包含指向
父项目
的指针,那么您所说的将是正确的。但是当它存储对象时,
父项目
复制构造函数用于在容器中插入(
推回
)对象时复制
本地项目(标题、演示、文件)
对象,然后容器存储一个
父项目
,而不是
本地项目
。因此,
m_Current
不再是一个
local_项目

您应该将
m_项目
更改为
std::vector
。然后你的动态演员阵容就会发挥作用

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

m_Current = m_Projects[0];
确保在清除容器时删除对象,以避免内存泄漏。或者简单地使用Or


正如Mark Ransom所评论的,请参见

。搜索“对象切片”了解更多信息。谢谢你们。我没有想到我的对象会被复制。当我在调试器中仔细观察时,我现在意识到了这一点(展开向量严格地显示了一些基类对象),几乎可以肯定,这比原始指针更有可能是正确的,因为他的向量当前拥有对象。
unique\u ptr
可能还不够,因为除非传递deleter,否则它不会处理类型擦除<代码>共享\u ptr将处理deleter@Bryan陈:我不知道你的意思。指向基的唯一指针工作得非常好。类型擦除由虚拟析构函数处理,这是标准做法。