#include <stdio.h>
#include <stdlib.h>
typedef struct {
void (*func1)(void *);
void (*func2)(void *);
} Template;
void templateMethod1(void *self) {
Template *t = (Template *)self;
printf("Running template method 1...\n");
t->func1(self);
printf("Template method 1 done.\n");
}
void templateMethod2(void *self) {
Template *t = (Template *)self;
printf("Running template method 2...\n");
t->func2(self);
printf("Template method 2 done.\n");
}
typedef struct {
Template parent;
int data1;
int data2;
} SubA;
void subAfunc1(void *self) {
SubA *obj = (SubA *)self;
printf("Running SubA method 1...\n");
printf("SubA data1 = %d\n", obj->data1);
}
void subAfunc2(void *self) {
SubA *obj = (SubA *)self;
printf("Running SubA method 2...\n");
printf("SubA data2 = %d\n", obj->data2);
}
typedef struct {
Template parent;
char *name;
} SubB;
void subBfunc1(void *self) {
SubB *obj = (SubB *)self;
printf("Running SubB method 1...\n");
printf("SubB name = %s\n", obj->name);
}
void subBfunc2(void *self) {
SubB *obj = (SubB *)self;
printf("Running SubB method 2...\n");
printf("SubB name length = %d\n", strlen(obj->name));
}
int main() {
SubA *objA = (SubA *)malloc(sizeof(SubA));
objA->data1 = 123;
objA->data2 = 456;
objA->parent.func1 = subAfunc1;
objA->parent.func2 = subAfunc2;
SubB *objB = (SubB *)malloc(sizeof(SubB));
objB->name = "Hello, world!";
objB->parent.func1 = subBfunc1;
objB->parent.func2 = subBfunc2;
objA->parent.func1(objA);
objA->parent.func2(objA);
objB->parent.func1(objB);
objB->parent.func2(objB);
free(objA);
free(objB);
return 0;
}