15

我在使用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
     }

};
4

4 回答 4

19

看到带有 boost::shared_ptr 的 static_cast?

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

于 2010-11-25T13:59:05.297 回答
4

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

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

于 2010-11-25T14:04:34.427 回答
1

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

于 2010-11-25T13:58:10.300 回答
0

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

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

于 2010-11-25T14:01:41.267 回答