История изменений
Исправление KivApple, (текущая версия) :
Если говорить про ООП синтаксический сахар, то в Go есть ещё интерфейсы, коих нет в C. В C нету какого-либо специального сахара для ООП. По такому критерию многие относят C к языку без ООП.
Но с другой стороны, в принципе практически на любом языке можно писать в ООП стиле и C не исключение. Просто методы будут обычными функциями, берущим указатель на структуру с полями объекта первым аргументом. Виртуальные методы будут обычными полями структуры типа указатель на функцию (опять же, по соглашению первый аргумент будет инстанс объекта). Либо можно сделать отдельную структуру с указателями на все виртуальные функции и хранить указатель уже на неё в одном из полей основной структуры. Наследование реализуется через встраивается структуры родителя первым полем в ребёнка и кастами типа указателя туда-сюда в зависимости от того вызываем ли мы метод родителя или потомка.
Такой подход применяется во множестве сишных программ и библиотек. Даже банальный libzip принимает некое подобие такого объекта с виртуальными методами для возможности создавать кастомный ридер данных архива. Есть и комбайны типа GLib и построенным на нём GTK, которые активно используют ООП и позволяют расширять прикладному коду.
Исходная версия KivApple, :
Если говорить про ООП синтаксический сахар, то в Go есть ещё интерфейсы, коих нет в C.
С другой стороны, в принципе практически на любом языке можно писать в ООП стиле и C не исключение. Просто методы будут обычными функциями, берущим указатель на структуру с полями объекта первым аргументом. Виртуальные методы будут обычными полями структуры типа указатель на функцию (опять же, по соглашению первый аргумент будет инстанс объекта). Либо можно сделать отдельную структуру с указателями на все виртуальные функции и хранить указатель уже на неё в одном из полей основной структуры. Наследование реализуется через встраивается структуры родителя первым полем в ребёнка и кастами типа указателя туда-сюда в зависимости от того вызываем ли мы метод родителя или потомка.
Такой подход применяется во множестве сишных программ и библиотек. Даже банальный libzip принимает некое подобие такого объекта с виртуальными методами для возможности создавать кастомный ридер данных архива. Есть и комбайны типа GLib и построенным на нём GTK, которые активно используют ООП и позволяют расширять прикладному коду.