使用基类的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
}
};
答案 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
。相反,请考虑一下您的设计: Base
是Base
,这是一种非常强大的关系,因此请仔细考虑{{1}}接口以及具体类型真的必须知道。
答案 2 :(得分:1)
如果未在基类(虚拟或非虚拟)中声明derivedMethod,则编译失败是正常的。共享ptr知道并使用基类(通过它所持有的指针),并且对派生类及其特定方法一无所知。
答案 3 :(得分:0)
即使使用原始指针,您的代码也无效。
您甚至需要在基类中声明derivedMethod()
方法,或者指向Derived
对象。