我有一类以下设计:
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几乎是唯一的。 最佳答案
解决这个问题的方法是virtual copy constructor;这在C++中是不允许的(这是不允许的,因为构造函数与类本身有关,不能委托(delegate)给类的子级)。这就是为什么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
}
关于c++ - 创建指向纯虚拟类的新指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20925809/