#include #include class Node { public: Node() {} virtual ~Node() = default; virtual int eval() = 0; private: }; class Number : public Node { public: Number(int value) : value{value} {} int eval() override { return value; } private: int value; }; class Binary : public Node { public: Binary(Node& lhs, Node& rhs) : lhs{lhs}, rhs{rhs} {} protected: Node& lhs; Node& rhs; }; class Addition : public Binary { public: Addition(Node& lhs, Node& rhs) : Binary(lhs, rhs) {} int eval() override { return lhs.eval() + rhs.eval(); } private: }; class Multiplication : public Binary { public: Multiplication(Node& lhs, Node& rhs) : Binary(lhs, rhs) {} int eval() override { return lhs.eval() * rhs.eval(); } private: }; 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; }