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陈:我不知道你的意思。指向基的唯一指针工作得非常好。类型擦除由虚拟析构函数处理,这是标准做法。