★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★
Сайт Димарика
Последнее обновление: Май 2026
★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★ ✦ ★
НАВИГАЦИЯ
> Главная
> 🔥 Лента приколов
> 📰 Новости
> 📔 Блог
> 🚧 Фотогалерея
> 🚧 Полезные ссылки
> 🚧 Гостевая книга
> Написать мне
ПОДПИСКА
RSS Подписаться на блог
СТАТИСТИКА
*** HIT COUNTER ***
006722
TOTAL VISITORS
Сегодня: 523
Онлайн: 2
Рекорд дня: 523
(03.05.2026)

ПОГОДА
ГлавнаяБлог → oop

📔 Блог Димарика / oop [× сбросить]
Абстракции и наследование в Си - стреляем по ногам красиво
Опубликовано: 15.06.2022 12:00 #Dev #c #oop #упрлс

TL;DR https://github.com/ddoroshev/c-inheritance

Иногда нет-нет да и хочется что-нибудь абстрагировать и обобщить в коде на Си. К примеру, хочешь ты принтануть содержимое структуры несколько раз, пишешь везде, как дурак, printf("%s %d %f\n", foo->bar, foo->baz, foo->boom), и интуитивно кажется, что есть способ сделать foo->print(foo), и так вообще со всеми структурами, не только с foo.

Возьмем пример: есть некий чувак с именем и фамилией, и есть птица, у которой есть имя и владелец.

typedef struct Person Person;
struct Person {
    char *first_name;
    char *last_name;
};

typedef struct Bird Bird;
struct Bird {
    char *name;
    Person *owner;
};

Чтобы вывести информацию про этих животных, кондовый сишник напишет просто две функции:

void Person_Print(Person *p) {
    printf("%s %s\n", p->first_name, p->last_name);
}

void Bird_Print(Bird *b) {
    printf("%s of %s %s\n", b->name, b->owner->first_name, b->owner->last_name);
}

И будет таки прав! Но что если подобных структур у нас много, а наш мозг испорчен веяниями ООП?

[ читать дальше » ]


СЛУЧАЙНАЯ ЦИТАТА
Повесил свой сюртук на cron...

[ Новая цитата ]
ДРУЗЬЯ
kk.consulting kk.consulting
пиши на webmaster@dimarik.com,
если хочешь присоединиться
СТАТУС СЕРВЕРА
$ uptime
вычисляем...
$ git log --oneline -1
15c066f Move the widgets around
ЛУЧШЕ СМОТРИТСЯ В
Internet Explorer Firefox

PROUDLY MADE WITH
OpenAI Claude Code
Python Django