Ваши две функции имеют одно и то же имя, operator++
. Это просто пишется иначе, чем функция с именем с идентификатором. Правило поиска членов класса заключается в том, что по умолчанию, если член с именем обнаружен в производном классе, базовый класс не проверяется. Производный элемент «скрывает» базовый элемент.
Обычный способ избежать сокрытия функции базового класса с другой сигнатурой и позволить разрешению перегрузки выбрать лучшую функцию с помощью объявления-использования:
struct der : public base<der> {
der &operator++(){
return *this;
}
using base<der>::operator++;
};