Boost shared_ptr传递派生类

时间:2013-06-04 16:05:31

标签: c++ boost shared-ptr derived-class

所以我有类似的东西

class baseclass {
....
}

class derived : public baseclass {
...
}

void func(boost::shared_ptr<baseclass>& a){
//stuff
}

boost::shared_ptr<derived> foo;

func(foo);

这会有用吗?我假设不是因为它不是同一类型,但是我没有能力将它强制转换为正确的类型,所以有没有你可以想到的任何可以使它工作的工作?

编辑:我不能根据我的知识进行演员的原因是因为我正在对boost::shared_ptr<derived>类型的向量进行排序,所以我只用vec.begin()和vec.end调用sort ()

3 个答案:

答案 0 :(得分:4)

  每当shared_ptr<T>可以隐式转换为shared_ptr<U>时,

T*就可以隐式转换为U*。特别是,shared_ptr<T>可以隐式转换为shared_ptr<T const>,转换为shared_ptr<U>,其中U是Tshared_ptr<void>的可访问基础。

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#Members

但是,现在你的代码现在已经不行了。 boost::shared_ptr<baseclass>对象的隐式构造必须绑定到const引用,或者复制到构造之外的持久化。

考虑

void func(boost::shared_ptr<baseclass> a)

void func(const boost::shared_ptr<baseclass>& a)

答案 1 :(得分:1)

是的,它会起作用。编译它不是比在这里问的更快吗?

shared_ptr有一个模板化转换构造函数,允许从shared_ptr<D>shared_ptr<B>的隐式转换,如果(且仅当)D*可隐式转换为B* < / p>

答案 2 :(得分:1)

我会非常惊讶。你需要传递适当类型的左值。为了使它工作,这个类应该是基类,而事实并非如此。

注意:如果你的函数将ptr取值或const&amp;其他规则也适用。