[英]How to add a base class to a vector of derived classes
我有一个std::vector
,它拥有指向派生类cDerivedClass
共享指针,我也有针对基类的共享指针。 所以像这样:
typedef SHARED_PTR<cBaseClass> cBaseClassPtr;
typedef SHARED_PTR<cDerivedClass> cDerivedClassPtr;
std::vector<cDerivedClassPtr> vDerivedPtrList;
现在,如果我想拥有一个CDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)
方法,该方法采用cBaseClassPtr类型的参数并将其添加到派生类的向量(vDerivedPtrList)中,我该怎么做?
我知道dynamic_cast无法正常工作,因为除非基类是多态的,否则动态转换不允许进行基到源的转换。 我尝试将cBaseClassPtr强制转换为cDerivedClassPtr,但是抛出了错误。
void cDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)
{
MY_ASSERT(inpBaseClass, "Component cannot be NULL");
cDerivedClassPtr pDerviedPtrToAdd = static_cast<cDerivedClassPtr>(inpBaseClass);
this->mvComponentList.push_back(pDerviedPtrToAdd);
}
编辑:确切地说,这是我得到的错误:
No matching conversion of static_cast from 'cBaseClassPtr' (aka 'shared_ptr<cBaseClassPtr>') to 'cDerivedClassPtr' (aka 'shared_ptr<cDerivedClassPtr>');
我正在使用boost的智能指针boost::shared_ptr
如果您的CDerivedClass::AddComponent
函数只能真正处理cDerivedClassPtr
,则相应地调整其签名:
CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)
如果应该能够处理cBaseClassPtr
,则调整vDerivedPtrList
的定义以容纳cBaseClassPtr
:
std::vector<cBaseClassPtr> vBasePtrList;
很难确切知道您要在此处执行的操作以及正在使用的智能指针实现。
为什么您的基类不是多态的? 如果是这样,则可以使用某种双调度将其添加到适当的集合中。
如果每个派生都有不同的向量,则每个派生类将知道应该将其自身添加到哪个派生类。
您将需要您的基类从enable_shared_From_this派生,以便它可以共享指针本身(如果当前已经是shared_ptred(大概是)):尽管这会将shared_ptr本身转换为基类型,然后您可以根据其寿命创建另一个shared_ptr首先将其放入收藏夹中。
(这是假设您正在使用boost,我认为std具有相同的接口)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.