一个简单的代码
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
但这也不起作用(编译错误),并且
new
与智能指针一起使用也不是recommended。什么是正确的解决方案?
到目前为止,我发现的唯一可行的解决方案
unique_ptr<Base> basePtr = unique_ptr<Base>((Base*)new Derived());
看起来真的很丑。
最佳答案
您的类(class)正在从基类中 secret 继承。这是class
的默认值,而struct
的默认值是公共(public)继承。这使得外部派生到基本的转换无效。 unique_ptr
通过公共(public)继承(live example)可以很好地处理派生到基础的转换:
class Base {};
class Derived : public Base {};
^^^^^^
如下所述,在使用
unique_ptr
时,将虚拟析构函数添加到基类也很重要,因为多态破坏依赖于此来定义良好的行为。 shared_ptr
不需要此功能,但这已成为话题。