#include #include using namespace std; class Behaviour { public: Behaviour() = default; virtual ~Behaviour() = default; virtual int apply(int target) const = 0; }; class Square : public Behaviour { public: int apply(int target) const override { return target * target; } }; class Add : public Behaviour { public: Add(int value) : value {value} {} int apply(int target) const override { return target + value; } private: int value; }; int apply_behaviour(int value, Behaviour const& behaviour) { return behaviour.apply(value); } int main() { int value{0}; Add a1{3}; Square s1{}; Add a2{1}; Square s2{}; value = apply_behaviour(value, a1); value = apply_behaviour(value, s1); value = apply_behaviour(value, a2); value = apply_behaviour(value, s2); std::cout << value << std::endl; return 0; }