class Object { /* */ };
和一些派生的:
class Derived1 : public Object { /* */ };
class Derived2 : public Object { /* */ };
我有一个函数可以创建派生对象并返回Object
;
Object *make()
{
return new Derived1();
}
所以,这种方式我必须通过智能指针包装返回的对象,但要使用什么返回类型?
TYPE? make()
{
return boost::shared_ptr<Derived1>(new Derived1());
}
答案 0 :(得分:7)
你可以使用:
boost::shared_ptr<Object> make()
{
return boost::shared_ptr<Object>(new Derived1());
}
答案 1 :(得分:4)
逻辑上,自然转换将是boost::shared_ptr<Object>
,但如果函数总是返回Derived1
,那么最好返回boost::shared_ptr<Derived1>
以便客户端如果他们愿意,可以利用更好的静态类型信息。
为什么原始函数必须丢弃静态类型信息?
答案 2 :(得分:2)
答案很简单:
boost::shared_ptr<Object> make()
{
return boost::shared_ptr<Derived1>(new Derived1());
}
因为智能指针保存指针属性wrt类型转换。