我有一类以下设计:

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/

10-17 00:30