【问题标题】:C++ smart pointers polymophismC++ 智能指针多态性
【发布时间】: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_caststatic_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


【解决方案1】:

dynamic_pointer_cast 必须适用于这种情况。也许您在投射时做错了什么。
它应该是这样的:

std::shared_ptr<Base> base(new Base);
std::shared_ptr<Derived> derived = std::dynamic_pointer_cast<Derived>(base);

再次查看您的代码,问题可能是您使用. 而不是-&gt; 调用object_ptr3.functionB();object_ptr3 是一个shared_ptr,因此. 运算符将访问shared_ptr 类的成员,而不是您的派生类。

另外,sharedshared_ptr 吗?

【讨论】:

  • 是的,shared 是一个 shared_ptr。我正在编辑我的问题以改变这一点。
  • 感谢您的回答。这些是我帖子中的错别字。我对 shared_ptr 的使用和你的代码一样
猜你喜欢
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多