LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Если говорить про ООП синтаксический сахар, то в Go есть ещё интерфейсы, коих нет в C. В C нету какого-либо специального сахара для ООП. По такому критерию многие относят C к языку без ООП.

Но с другой стороны, в принципе практически на любом языке можно писать в ООП стиле и C не исключение. Просто методы будут обычными функциями, берущим указатель на структуру с полями объекта первым аргументом. Виртуальные методы будут обычными полями структуры типа указатель на функцию (опять же, по соглашению первый аргумент будет инстанс объекта). Либо можно сделать отдельную структуру с указателями на все виртуальные функции и хранить указатель уже на неё в одном из полей основной структуры. Наследование реализуется через встраивается структуры родителя первым полем в ребёнка и кастами типа указателя туда-сюда в зависимости от того вызываем ли мы метод родителя или потомка.

Такой подход применяется во множестве сишных программ и библиотек. Даже банальный libzip принимает некое подобие такого объекта с виртуальными методами для возможности создавать кастомный ридер данных архива. Есть и комбайны типа GLib и построенным на нём GTK, которые активно используют ООП и позволяют расширять прикладному коду.

Исходная версия KivApple, :

Если говорить про ООП синтаксический сахар, то в Go есть ещё интерфейсы, коих нет в C.

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

Такой подход применяется во множестве сишных программ и библиотек. Даже банальный libzip принимает некое подобие такого объекта с виртуальными методами для возможности создавать кастомный ридер данных архива. Есть и комбайны типа GLib и построенным на нём GTK, которые активно используют ООП и позволяют расширять прикладному коду.