Традиционным решением является структура указателя на функцию. Я подчеркиваю традиционный. Я могу сказать вам, какой код я написал в PL / I и C много лет назад, но я не претендую на то, чтобы говорить за «искусство», если вы можете назвать это искусством.
Существует много вариантов этого, и ниже приведен небольшой компромисс.
struct SortOfAnAbstractClass {
int (*function1)(SortOfAnAbstractClass* this, int arg1, int arg2, char * arg3);
void (*function2)(SortOfAnAbstractClass* this, char *arg);
};
struct SortOfDerived {
struct SortOfAnAbstractClass base;
int instanceVariable1;
};
SortOfAnAbstractClass getMeOne() {
SortOfDerived *d = malloc(sizeof SortOfDerived);
memset(d, 0, sizeof SortOfDerived);
d->function1 = myf1;
d->function2 = myf2;
return &d->base;
};
, а затем «myf1» и «myf2» задают свои параметры «this» и отправляются в город. Вы можете расширить это, чтобы выглядеть как виртуальная рассылка.
Еще одно распространенное отклонение от туманов времени:
struct SortOfAClass {
void *creatorInfo;
int (*function1)(SortOfAnAbstractClass* this, int arg1, int arg2, char * arg3);
void (*function2)(SortOfAnAbstractClass* this, char *arg);
};
В этом варианте нет наследования по включению. Каждый из производных классов помещает свое личное состояние в собственный объект в creatorInfo.