如何正确地使一个对象拥有另一个多态对象?

How to properly make an object own another polymorphic object?

我正在寻找一种保存和干净的方法来使一个对象拥有另一个(多态!)对象,它在构造函数中被初始化。 此外,我想通过 getter.

访问它

在扫描了几个关于 SO 的博客和帖子后,我认为最好使用 std::unique_ptr 完成此操作并想出这个:

#include <memory>

class owned {};

class owner {
    const std::unique_ptr<const owned> m_owned;
public:
    owner(std::unique_ptr<const owned>&& o) : m_owned{ std::move(o) } {}
    const owned& owned() const { return *m_owned; }
};

int main() {
    std::unique_ptr<owned> _owned{ std::make_unique<owned>(owned()) };
    owner _owner(std::move(_owned));
}

但是,我对 std::unique_ptr 的细节不是很熟悉,因此不确定这是否是实现我的想法的好方法。特别是std::move的双重使用让我怀疑...

所以问题是:这是将多态对象的所有权转移给另一个对象并使其可访问的首选方法吗?如果不是,什么是最好的方法?

看起来不错。我会把 && 放在一个地方:

owner(std::unique_ptr<const owned> o) :

因为不需要。

一个问题;如果添加 owner(owner&&)=default;,则 owned 有时可能为空。所以检测该状态的方法是好的。