Класс - та же структура, только какая-то часть данных сокрыта от «внешнего мира». Допустим, я говорю экземпляру структуры man: someMan.kick(). При этом внутри структуры у инкапсулированной переменной health отнимается какое-то значение. Далее я спрашиваю экземпляр: someMan.isAlive() она отвечает да или нет основываясь на своей переменной health. Важно, что при этом класс не демонстрирует всем направо и налево, что у него есть переменная health.
Не вижу противоречия. Ты написал ООП код. Да, на C можно писать в ООП-стиле, более того, почти все большие проекты на С, которые я видел, объектно-ориентированы по самые помидоры.
Ты думал неверно. Называть можно как угодно, и реализация тоже может быть самой разной. В основе ООП лежит базовая идея. Следуешь этой идее — используешь ООП.