В любом случае, в C вы делаете это так, как это делал cfront в первые дни C ++, когда код C ++ был переведен на C. Но вам нужно быть достаточно дисциплинированным и выполнять всю тяжелую работу вручную.
Ваши «классы» должны быть инициализированы с использованием функции, которая выполняет работу конструктора. это будет включать инициализацию указателя на таблицу указателей полиморфных функций для виртуальных функций. Вызовы виртуальных функций должны выполняться через указатель функции vtbl (который будет указывать на структуру указателей функций - по одному для каждой виртуальной функции).
Структура виртуальной функции для каждого производного запроса должна быть надмножеством структуры базового класса.
Некоторые механизмы этого могут быть скрыты / поддерживаются с помощью макросов.
Первое издание Miro Samek «Практические диаграммы состояний в C / C ++» содержит Приложение A - «C + - Объектно-ориентированное программирование в C», в котором есть такие макросы. Похоже, это было исключено из второго издания. Возможно, потому что это больше проблем, чем стоит. Просто используйте C ++, если вы хотите это сделать ...
Вы также должны прочитать Липпмана «Внутри объектной модели C ++» , в котором подробно рассказывается о том, как C ++ работает за кулисами, часто с фрагментами того, как все может работать в C.
Я думаю, что вижу, что вы после. Может быть.
Как может что-то подобное работать:
typedef
struct foo {
int a;
} foo;
void doSomething( foo f); // note: f is passed by value
typedef
struct bar {
foo base;
int b;
} bar;
int main() {
bar b = { { 1 }, 2};
doSomething( b); // how can the compiler know to 'slice' b
// down to a foo?
return 0;
}
Ну, вы не можете сделать это так просто без языковой поддержки - вам нужно будет сделать некоторые вещи вручную (вот что означает отсутствие языковой поддержки):
doSomething( b.base); // this works