具有boost scoped_ptr的C++多态性

C++ polymorphism with boost scoped_ptr

本文关键字:C++ 多态性 ptr boost scoped 具有      更新时间:2023-10-16

为什么下面的代码不允许调用foo(ptr)?

#include <boost/scoped_ptr.hpp>
struct A {
    virtual ~A() {}
};
struct B: public A {};
void foo(boost::scoped_ptr<A>& a) {}
void goo(A& a) {}
int main() {
    boost::scoped_ptr<B> ptr(new B);
    foo(ptr);
    B b;
    goo(b);
}

我们传递引用的相应表单按预期工作。我们不应该做多态性吗使用boost scoped_ptr?

g++与升压1.49给我:

error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’

这是因为foo出于某种原因,通过引用来获取作用域指针。这是完全没有必要的,也是呼叫失败的原因。有从scoped_ptr<B>scoped_ptr<A>的转换,但没有从scoped_ptr<B>&scoped_ptr<A>&的转换。

您应该将其作为const的引用传递。

void foo(boost::scoped_ptr<A> const & a) {}

顺便说一句,这本身并不是智能指针的"问题"。以下代码失败的原因与您的代码相同。

void foo(A*& p) {}
int main()
{
    B* p = new B;
    foo(p); //FAIL
}

为了解决这个问题,你必须通过值传递指针,或者,如果你足够变态,通过引用const

 void foo (A * const & p); // <-- a perv wrote this