创建一个指向纯虚拟类的新指针

时间:2014-01-04 19:39:24

标签: c++ abstract-base-class

我有一类以下设计:

class Meal {
public:
    virtual void cook() = 0; // pure virtual
}

class Omelette : Meal {
public:
    void cook() {/*do something*/}; // non-virtual
}

class Waffle : Meal {
public:
    void cook() {/*do something*/}; // non-virtual
}

std::vector< std::unique_ptr<Meal> > menu;

void addMeal(const Meal& meal) {
    menu.emplace_back(new Meal(meal)); // cannot allocate an object of abstract type
}

我无法找到将Meal派生的对象添加到menu的方法,因为我无法创建抽象对象。有没有办法执行上面的代码? 我更希望Meal保持抽象。我可以传入指向现有Meal派生对象的指针,但是我的unique_ptr几乎不是唯一的。

2 个答案:

答案 0 :(得分:2)

您可以实现一个getNew虚方法,该方法返回(派生)对象的新副本并改为使用它。

答案 1 :(得分:2)

此问题的解决方案是virtual copy constructor;这在C ++中是不允许的(不允许这样做,因为构造函数是与类本身相关的东西,它不能委托给类的子元素)。这就是clone最适合这个问题的原因。

以下是similar answer,其中包含最流行的语法。

所以,你的代码应该是

class Meal {
public:
    virtual void cook() = 0; // pure virtual
    virtual Meal* clone() const = 0; // pure virtual clone.
};

class Omelette : public Meal {
public:
    void cook() {
    /*do something*/ 
    }; // non-virtual
    virtual Omelette* clone() const
    {
        return new Omelette(*this);
    }
};

class Waffle : public Meal {
public:
    void cook() {
        /*do something*/
    }; // non-virtual
    virtual Waffle* clone() const
    {
        return new Waffle(*this);
    }
};

std::vector< std::unique_ptr<Meal> > menu;

void addMeal(const Meal& meal) {
    menu.emplace_back( meal.clone() ); // cannot allocate an object of abstract type
}