#include class Node { public: virtual ~Node() = default; virtual int eval() const = 0; }; class Number : public Node { public: Number(int number) : number { number } { } int eval() const override { return number; } private: int number; }; class Binary : public Node { public: Binary(Node& left, Node& right) : left { left }, right { right } { } protected: Node& left; Node& right; }; class Addition : public Binary { public: using Binary::Binary; int eval() const override { return left.eval() + right.eval(); } }; class Multiplication : public Binary { public: using Binary::Binary; int eval() const override { return left.eval() * right.eval(); } }; int main() { Number five{5}; Number three{3}; Number two{2}; Multiplication multiplication{five, two}; Addition addition{three, multiplication}; std::cout << addition.eval() << std::endl; }