#include <iostream>
using namespace std;
class Menu {
private:
int price;
public:
Menu(int p=0) : price{p} {}
virtual string description() = 0;
virtual int getPrice() {
return price;
}
virtual ~Menu() {}
};
class WithLemon : public Menu {
private:
Menu* meniu;
public:
WithLemon() = default;
WithLemon(Menu* n) :
meniu{ n } {}
string description() override {
return meniu->description() + " with lemon ";
}
};
class WithCoffee : public Menu {
private:
Menu* meniu;
public:
WithCoffee(Menu* n) :
meniu{ n } {
}
string description() override{
return meniu->description() + " with coffee ";
}
int getPrice() override{
return meniu->getPrice()+5;
}
};
class Breakfast : public Menu {
private:
string name;
public:
Breakfast(string n, int p) :
name{ n }, Menu{ p} {
}
string description() override {
return name;
}
};
int main() {
Breakfast a{"eggs", 10};
WithCoffee breakfast_with_coffee { &a };
cout << breakfast_with_coffee.description() << " " << breakfast_with_coffee.getPrice() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgTWVudSB7CnByaXZhdGU6CiAgICBpbnQgcHJpY2U7CnB1YmxpYzoKICAgIE1lbnUoaW50IHA9MCkgOiAgcHJpY2V7cH0ge30KICAgIHZpcnR1YWwgc3RyaW5nIGRlc2NyaXB0aW9uKCkgPSAwOwogICAgdmlydHVhbCBpbnQgZ2V0UHJpY2UoKSB7CiAgICAgICAgcmV0dXJuIHByaWNlOwogICAgfQogICAgdmlydHVhbCB+TWVudSgpIHt9Cn07CmNsYXNzIFdpdGhMZW1vbiA6IHB1YmxpYyBNZW51IHsKcHJpdmF0ZToKICAgIE1lbnUqIG1lbml1OwogICAgCnB1YmxpYzoKICAgIFdpdGhMZW1vbigpID0gZGVmYXVsdDsKICAgIFdpdGhMZW1vbihNZW51KiBuKSA6CiAgICAgICAgbWVuaXV7IG4gfSB7fQogICAgc3RyaW5nIGRlc2NyaXB0aW9uKCkgb3ZlcnJpZGUgewogICAgICAgIHJldHVybiBtZW5pdS0+ZGVzY3JpcHRpb24oKSArICIgd2l0aCBsZW1vbiAiOwogICAgfQp9OwoKY2xhc3MgV2l0aENvZmZlZSA6IHB1YmxpYyBNZW51IHsKcHJpdmF0ZToKICAgIE1lbnUqIG1lbml1OwpwdWJsaWM6CiAgICBXaXRoQ29mZmVlKE1lbnUqIG4pIDoKICAgICAgICBtZW5pdXsgbiB9IHsKICAgIH0KICAgIHN0cmluZyBkZXNjcmlwdGlvbigpIG92ZXJyaWRlewogICAgICAgIHJldHVybiBtZW5pdS0+ZGVzY3JpcHRpb24oKSArICIgd2l0aCBjb2ZmZWUgIjsKICAgIH0KICAgIGludCBnZXRQcmljZSgpIG92ZXJyaWRlewogICAgCXJldHVybiBtZW5pdS0+Z2V0UHJpY2UoKSs1OyAKICAgIH0KfTsKCmNsYXNzIEJyZWFrZmFzdCA6IHB1YmxpYyBNZW51IHsKcHJpdmF0ZToKICAgICAgc3RyaW5nIG5hbWU7CnB1YmxpYzoKICAgIEJyZWFrZmFzdChzdHJpbmcgbiwgaW50IHApIDoKICAgICAgICBuYW1leyBuIH0sIE1lbnV7IHB9ICB7CiAgICB9CiAgICBzdHJpbmcgZGVzY3JpcHRpb24oKSBvdmVycmlkZSB7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIEJyZWFrZmFzdCBheyJlZ2dzIiwgMTB9OwogICAgV2l0aENvZmZlZSBicmVha2Zhc3Rfd2l0aF9jb2ZmZWUgeyAmYSB9OwogICAgY291dCA8PCBicmVha2Zhc3Rfd2l0aF9jb2ZmZWUuZGVzY3JpcHRpb24oKSA8PCAiICIgPDwgYnJlYWtmYXN0X3dpdGhfY29mZmVlLmdldFByaWNlKCkgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9