【发布时间】:2013-04-12 11:36:40
【问题描述】:
我有一个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
【问题讨论】:
-
你为什么要这样做。从基类转换为派生类是不行的……除非你知道基类是派生类,但这可能表明设计不好。
-
就个人而言,我在这里看到了一个设计缺陷。