c++ std::unique_ptr从虚拟类

oknwwptz  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(186)

如何使用std::unique_ptr与多态性习惯用法?例如:

class Abstract {
    virtual void foo() = 0;
}

class Child1 final : public Abstract {
    void foo() override;
}

class Child2 final : public Abstract {
    void foo() override;
}

void bar(const Abstract& a) {
    std::unique_ptr<Abstract> ptr = std::make_unique<Abstract>(a); // exception :(
}

int main() {
    Child1 c1;
    Child2 c2;

    bar(c1);
    bar(c2);
}

如何从Abstract的任何子对象初始化unique_ptr?

d8tt03nd

d8tt03nd1#

当示例化一个对象时,程序需要知 prop 体的类,否则它不能为它分配适当的内存。std::make_unqie创建一个全新的对象,而不仅仅是一个指针,你不能在这里创建一个抽象类的对象(Abstract):

std::unique_ptr<Abstract> ptr = std::make_unique<Abstract>(a);

你缺少的是你可以把基类的指针赋值给派生类的指针:

std::unique_ptr<Abstract> ptr = std::make_unique<Child2>();
xt0899hw

xt0899hw2#

您可以使用clone习惯用法,它允许多态克隆(或 copy)。

#include <memory>

namespace {

class Abstract {
public:
    virtual ~Abstract() = default;
    Abstract() = default;
    Abstract(Abstract const&) = default;
    virtual void foo() = 0;
    virtual std::unique_ptr<Abstract> clone() const = 0;
};

class Child1 final : public Abstract {
public:
    void foo() override;
    std::unique_ptr<Abstract> clone() const override {
        return std::make_unique<Child1>(*this);
    }
};

class Child2 final : public Abstract {
public:
    void foo() override;
    std::unique_ptr<Abstract> clone() const override {
        return std::make_unique<Child2>(*this);
    }
};

void bar(const Abstract& a) {
    std::unique_ptr<Abstract> ptr = a.clone();
}

} // anon

int main() {
    Child1 c1;
    Child2 c2;

    bar(c1);
    bar(c2);
}

void Child1::foo() { }
void Child2::foo() { }

相关问题