【发布时间】:2013-05-07 13:51:47
【问题描述】:
我对智能指针很陌生,如果我的问题对你们中的一些人来说似乎很幼稚,我很抱歉。 这是我想做的一个例子:
using namespace std;
class Base
{
protected:
int m_Property;
public:
virtual function() {...;}
}
class DerivedA : public Base
{
public:
virtual function() {second implementation...;}
virtual functionA() {...;}
}
class DerivedB : virtual public Base, public DerivedA
{
public:
virtual functionB() {...;}
}
void main()
{
map<int, shared_ptr<Base>> myMap;
shared_ptr<Base> object_ptr1 = shared_ptr<Base>(new Base());
shared_ptr<Base> object_ptr2 = shared_ptr<Base>(new DerivedA());
shared_ptr<Base> object_ptr3 = shared_ptr<Base>(new DerivedB());
myMap.insert(pair<int, shared_ptr<Base>>(1,object_ptr1));
myMap.insert(pair<int, shared_ptr<Base>>(2,object_ptr2));
myMap.insert(pair<int, shared_ptr<Base>>(3,object_ptr3));
// What i want to do (cause I know for sure that object_ptr3 points to a DerivedB object):
object_ptr3->functionB();
}
假设我从 myMap 中提取了一个共享指针(我们称之为 myPointer),并且我想使用 DerivedB 特定的(但不是继承的虚拟)函数。 编译不明白,因为它认为myPointer(或上例中的object_ptr3)是Base类型。
我尝试使用 static_pointer_cast 和 dynamic_pointer_cast 进行强制转换(在某些情况下不起作用)... 处理这些情况的任何更好的 id。
提前致谢
【问题讨论】:
-
dynamic_pointer_cast或static_pointer_cast应该按预期工作。你能告诉我们你是如何使用它们的以及它失败的地方吗? -
shared是新模板还是拼写错误? -
这是编译器消息:1>c:\program files\microsoft visual studio 11.0\vc\include\memory(369): error C2635: cannot convert a 'Base*' to a 'DerivedC *';隐含从虚拟基类的转换问题是我有多重继承:DerivedC 继承自 Base 和 DerivedA。所以我使用 virtual 来避免“Base”类双重继承的问题
-
我在上面的源代码中没有看到
DerivedC类,所以我对转换失败并不感到非常惊讶。 -
对于菱形继承,您必须将所有继承设为虚拟。
标签: c++ c++11 polymorphism smart-pointers