基本类型指向派生对象的指针的make_unique的语法是什么?

问题描述

请考虑以下基类和派生类。

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>