В C все делается точно так же, но с менее выраженной поддержкой языка.Вместо того, чтобы создавать класс для инкапсуляции некоторого состояния, вы создаете структуру.Вместо создания членов класса с неявными этими параметрами вы создаете функции, которые явно передают struct * в качестве первого параметра, а затем оперируют над структурой.
Чтобы гарантировать, что инкапсуляция не нарушена, вы можете объявитьstruct в заголовке, но определите его только в файле .c, где он используется.Виртуальные функции требуют больше работы - но опять же, это всего лишь случай размещения указателей на функции в структуре.Что на самом деле более удобно в C, чем в C ++, потому что в C вы получаете возможность заполнять свои vtables вручную, получая довольно хороший уровень контроля над тем, какая часть кода реализует часть какого-либо COM-интерфейса (если вы, конечно, используете COM в C).