C++ C++;智能指针多态性

C++ C++;智能指针多态性,c++,c++11,polymorphism,smart-pointers,C++,C++11,Polymorphism,Smart Pointers,我对smart pointer很陌生,如果我的问题对你们中的一些人来说很幼稚,那么很抱歉。 下面是我想做的一个例子: using namespace std; class Base { protected: int m_Property; public: virtual function() {...;} } class DerivedA : public Base { public: virtual function() {second implementation...

我对smart pointer很陌生,如果我的问题对你们中的一些人来说很幼稚,那么很抱歉。 下面是我想做的一个例子:

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();
}
使用名称空间std;
阶级基础
{
受保护的:
国际货币基金组织财产;
公众:
虚拟函数(){…;}
}
DerivedA类:公共基础
{
公众:
虚拟函数(){第二个实现…;}
虚拟函数(){…;}
}
类DerivedB:虚拟公共基,公共DerivedA
{
公众:
虚拟函数B(){…;}
}
void main()
{
地图我的地图;
shared_ptr object_ptr1=shared_ptr(new Base());
shared_ptr object_ptr2=shared_ptr(new DerivedA());
shared_ptr object_ptr3=shared_ptr(new DerivedB());
插入(对(1,对象_ptr1));
插入(对(2,对象_ptr2));
插入(对(3,对象_ptr3));
//我想做什么(因为我确信object_ptr3指向一个DerivedB对象):
对象_ptr3->functionB();
}
假设我从myMap中提取了一个共享指针(称之为myPointer),并且我希望使用特定于DerivedB的(但不是继承的虚拟)函数。 编译后的程序不理解它认为myPointer(或上例中的object_ptr3)是基类型的原因

我试着用静态指针和动态指针来转换它(在某些情况下不起作用)。。。 有没有更好的身份证来处理这些情况


提前感谢

dynamic\u pointer\u cast
必须适用于这种情况。也许你在选角时做错了什么。
应该是这样的:

std::shared_ptr<Base> base(new Base);
std::shared_ptr<Derived> derived = std::dynamic_pointer_cast<Derived>(base);
std::共享ptr库(新库);
std::shared_ptr derived=std::dynamic_pointer_cast(基本);
再次查看代码,问题可能是您正在调用
object_ptr3.functionB()使用
而不是
->
object_ptr3
是一个
shared_ptr
,因此
操作符将访问
shared_ptr
类的成员,而不是您的派生类


此外,is
shared
a
shared\u ptr

动态指针投射
静态指针投射
应按预期工作。你能告诉我们你是如何使用它们的吗?它在哪里失败了?共享的
是一个新模板还是一个输入错误?下面是编译器的消息:1>c:\program files\microsoft visual studio 11.0\vc\include\memory(369):错误C2635:无法将“Base*”转换为“DerivedC*”;从虚拟基类转换意味着问题是我有多重继承:DerivedC继承自base和DerivedA。因此,我使用虚拟来避免“基类”双重继承的问题我在上面的源代码中没有看到DerivedC
类,因此我对转换失败并不感到非常惊讶。对于菱形继承,您必须将所有继承都虚拟化。是的,共享是共享的。我正在编辑我的问题以更改此设置。谢谢您的回答。这些都是我文章中的错字。我在shared_ptr中的用法与您的代码中的用法相同