我有一类以下设计:
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几乎不是唯一的。
答案 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
}