复制从抽象类派生的对象

时间:2018-05-05 12:11:28

标签: c++ pointers inheritance copy abstract-class

我有一个名为 component 的抽象基类。 它派生了非抽象类,如电阻 generator 等......

在我的 circuit 类中,我有一个名为std::vector<sim::component*>的异构component_list,我用它来处理插入电路中的所有组件。

然后我有以下功能:

void circuit::insert(sim::component& comp, std::vector<sim::node*> nodes)

在函数定义中,我想复制名为comp的组件 为了在我的component_list中插入指向它的指针 (这样我就可以管理它的生命周期)

我尝试过这些方法:

sim::component *copy = new sim::component(comp)

但当然,sim :: component是抽象的,我无法实现它

如何制作对象的副本,在编译时真正的类是未知的?

1 个答案:

答案 0 :(得分:3)

解决这个问题的一种传统方法是让对象自己克隆,再加上一些CRTP。

予。首先,使您的抽象类可克隆:

struct Component {
    virtual Component *clone() const = 0;
    virtual ~Component() {}
};

现在,每个组件都应该定义自己的clone()实现。

II。这很容易通过CRTP实现自动化:

template<class Concrete> struct CompBase: Component {
    Component *clone() const {
        return new Concrete(static_cast<Concrete const &>(*this));
    }
    virtual ~CompBase() {}
};

struct Generator: CompBase<Generator>;  // already has clone() defined

请注意,我在示例中使用了普通指针,但通常建议使用更多智能模拟。 std::unique_ptrstd::make_unique一起非常合适。

这创造了另一个机会:使用unique_ptr,您甚至可以忘记克隆并简单地将unique_ptrs作为对象传递,每个对象都有自己的具体类实例,并将它们存储在向量中。