В этих двух строках
X *x_base = new OK(0);
++x_base;
вы создаете указатель на новый экземпляр, а затем увеличиваете указатель, а не указатель.Оператор приращения вашей иерархии классов никогда не вызывается, вместо этого это вызывает встроенный оператор приращения для указателей.Это можно исправить, предварительно разыменовав указатель:
++*x_base; // or ++(*x_base), might be more readable
Вы также можете работать со ссылками вместо указателей, что позволяет использовать синтаксис приращения без необходимости разыменования указателя, например
OK ok(0);
X& x_base = ok;
++x_base; // now, x_base is a reference, no need to dereference it
Обратите внимание, что реализация вызываемой перегрузки оператора не меняет значение X::x
.std::cout << x_base->x;
после увеличения означает, что вы ожидаете, что значение будет ненулевым.