我有一个抽象类BakedGood
,CupCake
和Bread
来自。{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函数编写?
答案 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