#include #include using namespace std; class Coffee { public: virtual void make() = 0; virtual ~Coffee() = default; }; class SimpleCoffee : public Coffee { public: virtual void make() override { cout << "Coffee"; } }; class MilkDecorator : public Coffee { unique_ptr coffee; public: MilkDecorator(unique_ptr c) : coffee(move(c)) { } virtual void make() override { coffee->make(); cout << " + Milk"; } }; class SugarDecorator: public Coffee { unique_ptr coffee; public: SugarDecorator(unique_ptr c) : coffee(move(c)) { } virtual void make() override { coffee->make(); cout << " + Sugar"; } }; int main() { auto coffee = make_unique(); auto milk_coffee = make_unique(move(coffee)); auto sugar_coffee = make_unique(move(milk_coffee)); sugar_coffee->make(); cout << endl; }