深拷贝和动态转换 unique_ptr

2024-05-24

假设我有一个如下所示的类:

class A { virtual ~A(); ... }
class B : public A { ... }
class C : public A { ... }

我还有一个 unique_ptr 向量,它是这样声明的:

std::vector<std::unique_ptr<A>> vec;

假设 vec 使用派生类对象的 unique_ptr 填充。如果我想要任何向量元素(b 或 c)的深层副本,并让基类 unique_ptr 指向它,我该怎么办?最初我正在做类似的事情

std::unique_ptr<A> tmp = std::make_unique<A>(*b);

我认为这是不正确的。


一种可能的解决方案是在基类中声明一个虚拟克隆方法并为每个子类重写它:

class A {
    virtual ~A() {}
    virtual std::unique_ptr<A> clone() const = 0;
}
class B : public A {
    std::unique_ptr<A> clone() const override {
        return std::unique_ptr<A>(new B(*this));
    }
};

Edit:

使用示例:

void f(const A& original) {
    std::unique_ptr<A> copy = original.clone();
    // Here, copy points to an instance of class B.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深拷贝和动态转换 unique_ptr 的相关文章

随机推荐