将unique_ptr <derived>转换为unique_ptr <base />

时间:2018-07-06 11:42:44

标签: c++ pointers unique-ptr

简单的代码

class Base {};
class Derived : Base {};

unique_ptr<Base> Create() {
    unique_ptr<Base> basePtr = make_unique<Derived>(); // compile error
    return basePtr;
}

产生编译错误(“没有适当的转换”)。我发现similar question的解决方案是使用std::move。我尝试过了

unique_ptr<Derived> derived = make_unique<Derived>();
unique_ptr<Base> basePtr = std::move(derived); // compile error

但是现在std::move产生编译错误。我还发现question在哪里(如果我很好理解的话),如果我们使用的话,投射应该是自动的

unique_ptr<Base> basePtr = make_unique<Derived>(new Derived()); //compile error

但是这也不起作用(编译错误),并且recommended也不能new与智能指针一起使用。

什么是正确的解决方案?

到目前为止,我找到的唯一可行的解​​决方案

unique_ptr<Base> basePtr = unique_ptr<Base>((Base*)new Derived());

看起来真的很丑。

1 个答案:

答案 0 :(得分:14)

您的类正在从基类中私有继承。这是class的默认设置,而struct的默认设置是公共继承。这使得外部派生到基本的转换无效。 unique_ptr通过公共继承(live example)可以很好地处理派生基数转换:

 class Base {};
 class Derived : public Base {};
                 ^^^^^^

如下所述,在使用unique_ptr时,将虚拟析构函数添加到基类也很重要,因为多态破坏依赖于此来定义良好的行为。 shared_ptr不需要这样做,但是那已经成为话题。