部分覆盖虚函数

时间:2018-04-17 16:32:55

标签: c++ inheritance abstract-class

我有一个抽象类BakedGoodCupCakeBread来自。{1}}和ToString。在我的作业中,我需要在我的BakedGood类中包含一个虚函数"Chocolate cupcake with vanilla frosting and blue sprinkles ($1.95)" "Wheat bread ($4.50)" ,它返回BakedGood的描述 - 这里有两个可能描述的例子:

Item {
    id: root
    LW { id: leftWindow }
    RW { id: rightWindow }
}

字符串的价格部分在类之间共享,因此该部分必须在父类BakedGoods中完成,但其余部分与烘焙商品的类型相同,因此必须在子类中编写。我知道如何完全覆盖函数,但不知道如何部分覆盖它。我如何对此进行编码,以便字符串的共享部分用BakedGood的ToString函数编写,其余部分用CupCake和Bread的ToString函数编写?

2 个答案:

答案 0 :(得分:6)

创建一个纯虚拟成员函数,比如description(),它将生成字符串的初始部分,并从抽象类中的ToString()覆盖中调用它:

class BakedGood {
protected:
    virtual string description() const = 0;
public:
    double price() const ...
    string ToString() const {
        ostringstream oss;
        oss << description() << " ($";
        oss.precision(2);
        oss << price() << ")";
        return oss.str();
    }
};

class CupCake : public BakedGood {
protected:
    string description() const override {
        return "Chocolate cupcake with vanilla frosting and blue sprinkles";
    }
};

class Bread : public BakedGood  {
protected:
    string description() const override {
        return "Wheat bread";
    }
};

注意:此实现使用Template Method Design Pattern,这种方法允许您将实现保留在抽象基类中,同时将部分作业委托给其派生类。

答案 1 :(得分:3)

您可以在基类中实现该功能并打印价格。然后你可以在子节点中覆盖它来打印描述然后调用基类打印。以下是一个简单的例子:

class BakedGood {
    private:
        double price;
        ...
    public:
        virtual void print() const {
            std::cout << "($" << price << ')';
        }
        ...
};

class Bread : public BakedGood {
    public:
        void print() const {
            std::cout << "Wheat bread ";
            BakedGood::print();
        }
};

class CupCake: public BakedGood {
    public:
        void print() const {
            std::cout << "Chocolate cupcake ";
            BakedGood::print();
        }
};

在此处查看此行动:ideone