Creating a new pointer to a pure virtual class
abstract-base-class, c++
Solution
The solution to this problem is the virtual copy constructor; which is not allowed in C++ (It is not allowed because constructor is something related to the class itself, it can't be delegated to class's children). That why `clone` is the best fit for this problem.
Here is a similar answer, with most popular syntax.
So, you code shall be
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
}
Problem
I have a class of the following design: ``` 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 } ``` I'm unable to find a way of adding a `Meal`-derived object to the `menu` since I cannot create an abstract object. Is there a way of performing the above code? I'd prefer that `Meal` remain abstract. I could pass in a pointer to an existing `Meal`-derived object, but then my unique_ptr is hardly unique.