我对智能指针很新,很抱歉,如果我的问题对你们这些人来说很天真。 这是我想要做的一个例子:
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(在某些情况下不起作用)进行投射... 处理这些情况之王的任何更好的身份。
提前致谢
答案 0 :(得分:0)
dynamic_pointer_cast
必须适用于此案例。也许你在演员时做错了什么
它应该是这样的:
std::shared_ptr<Base> base(new Base);
std::shared_ptr<Derived> derived = std::dynamic_pointer_cast<Derived>(base);
再次查看您的代码,问题可能是您使用object_ptr3.functionB();
而不是.
来呼叫->
。 object_ptr3
是shared_ptr
,因此.
运算符将访问shared_ptr
类的成员而不是派生类。
另外,shared
是shared_ptr
吗?