如何解决基本类型指向派生对象的指针的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;
}
};
我想为unique_ptr
对象创建base
类型的derived
。我知道我能做到
std::unique_ptr<base> ptr{new derived};
但是当我这样做
auto ptr = std::make_unique<base>(derived{});
ptr->func();
这将打印base
,这不是我的预期行为。在这种情况下使用std::make_unique
的正确方法是什么?另外,auto ptr = std::make_unique<base>(derived{})
为什么会这样做?
解决方法
这样做的时候
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>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。