问题描述
请考虑以下基类和派生类。
class base
{
public:
int i{9};
virtual void func()
{
cout << "base" << endl;
}
virtual ~base()
{
}
};
class derived : public base
{
public:
int i{4};
void func()
{
cout << "derived" << endl;
}
};
@H_404_4@
我想为unique_ptr@H_404_4@对象创建
base@H_404_4@类型的
derived@H_404_4@。我知道我能做到
std::unique_ptr<base> ptr{new derived};@H_404_4@
但是当我这样做
auto ptr = std::make_unique<base>(derived{});
ptr->func();
@H_404_4@
这将打印base@H_404_4@,这不是我的预期行为。在这种情况下使用
std::make_unique@H_404_4@的正确方法是什么?另外,
auto ptr = std::make_unique<base>(derived{})@H_404_4@为什么会这样做?
解决方法
这样做的时候
auto ptr = std::make_unique<base>(derived{});
make_unique<base>
将创建一个unique_ptr<base>
,这意味着它将仅创建一个base
对象。由于derived
是从base派生的,因此将其传递给base
的副本构造函数是合法的,这样代码可以编译,但是您拥有base
,而不是derived
。 / p>
您需要的是
std::unique_ptr<base> ptr = std::make_unique<derived>();
获得指向base
对象的derived
指针。这不是您想要的语法,但是可以正常工作。
如果您使用过
auto ptr = std::make_unique<derived>();
然后ptr
将是std::unique_ptr<derived>
,而不是std::unique_ptr<base>
。