【问题标题】:boost::shared_ptr and dynamic castboost::shared_ptr 和动态转换
【发布时间】:2010-11-25 13:55:41
【问题描述】:

我在使用基类的shared_ptr 时遇到问题,在取消引用它时我似乎无法调用派生类的方法。我相信代码会比我更冗长:

class Base : public boost::enable_shared_from_this<Base>
{
  public:
    typedef  boost::shared_ptr<BabelNet> pointer;
};

class Derived : public Base
{
  public:
     static pointer  create()
                {
                        return pointer(new Derived);
                }
     void             anyMethod()
     {
        Base::pointer foo = Derived::create();
        // I can't call any method of Derived with foo
        // How can I manage to do this ?
        // is dynamic_cast a valid answer ?
        foo->derivedMethod(); // -> compilation fail
     }

};

【问题讨论】:

  • 如果您的示例是可编译的,这将有所帮助,当然有问题的行已被注释。

标签: c++ boost dynamic-cast boost-smart-ptr


【解决方案1】:

static_cast with boost::shared_ptr?

您需要使用dynamic_pointer_cast 来获得适当的shared_ptr 实例化。 (对应一个dynamic_cast

【讨论】:

  • 为什么不static_pointer_cast?我想也许这个例子不能代表真实的代码,但是这个例子不需要动态转换(因为对象是目标类型),并且不允许一个(因为两个类都没有任何虚函数) .
  • 我放dynamic_pointer_cast实际上是因为帖子的标题。但是是的,在他的代码中,static_pointer_cast 就可以了。
  • 好的,多亏了你,我发现了一篇有趣的文章:nealabq.com/blog/2008/11/26/pointer_cast 如果我只是将 shared_ptr 用于派生类,我可以将它作为 shared_ptr 传递给基类,整洁。跨度>
【解决方案2】:

是否共享指针,当你有一个指向Base的指针时,你只能从Base调用成员函数。

如果你真的需要dynamic_cast,你可以使用boost 中的dynamic_pointer_cast,但很可能你不应该这样做。相反,请考虑您的设计:DerivedBase,这是一个非常强的关系,因此请仔细考虑Base 接口以及是否真的必须知道具体类型。

【讨论】:

    【解决方案3】:

    如果派生方法没有在基类中声明(虚拟或非虚拟),那么编译失败是正常的。共享 ptr 知道并使用基类(通过它持有的指针),而对派生类及其具体方法一无所知。

    【讨论】:

    • 如果指针是派生类的typedef,是否可以向上转换,使外部类只能知道Base::pointer?
    【解决方案4】:

    即使使用原始指针,您的代码也无法工作。

    您需要在基类中声明derivedMethod() 方法,或者拥有指向Derived 对象的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 2011-05-07
      相关资源
      最近更新 更多