boost :: shared_ptr和动态强制转换

时间:2010-11-25 13:55:41

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

使用基类的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 个答案:

答案 0 :(得分:19)

请参阅static_cast with boost::shared_ptr?

您需要使用dynamic_pointer_cast来获取相应的shared_ptr实例。 (对应于dynamic_cast

答案 1 :(得分:4)

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

如果您确实需要dynamic_cast,则可以使用boost中的dynamic_pointer_cast,但您可能不应该使用Derived。相反,请考虑一下您的设计: BaseBase ,这是一种非常强大的关系,因此请仔细考虑{{1}}接口以及具体类型真的必须知道。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

即使使用原始指针,您的代码也无效。

您甚至需要在基类中声明derivedMethod()方法,或者指向Derived对象。

相关问题