如何将基类添加到派生类的向量中

时间:2013-04-12 11:36:40

标签: c++ pointers casting

我有一个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

的实现

2 个答案:

答案 0 :(得分:0)

如果您的CDerivedClass::AddComponent功能只能真正处理cDerivedClassPtr,请相应调整其签名:

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)

如果它应该能够处理cBaseClassPtr,那么请调整vDerivedPtrList的定义以保留cBaseClassPtr s:

std::vector<cBaseClassPtr> vBasePtrList;

答案 1 :(得分:0)

很难确切地知道你在这里要做什么,以及你正在使用什么智能指针实现。

为什么你的基类不是多态的?如果是这样的话,你可以使用某种双重调度将它自己添加到适当的集合中。

如果每个派生都有不同的向量,那么每个派生类都会知道它应该添加到哪一个。

你需要你的基类派生自enable_shared_From_this所以它可以共享指针本身,如果它当前已经是shared_ptred(可能是它):虽然这将shared_ptr本身变成基类型,然后你可以创建另一个shared_ptr基于第一个的生命,把它放在收藏中。

(假设您使用的是boost,我认为std具有相同的界面)