Estruturas C semelhantes a objetos

Embora a linguagem não seja orientada a objetos, você ainda pode adicionar alguns recursos semelhantes a objetos às suas estruturas C, como subclasses, métodos e sobrecarga.

Se você deseja criar uma “subclasse” da seguinte estrutura:

typedef struct {
int value;
} base_struct;

Você acabou de fazer uma nova estrutura e adicionar a antiga no topo:

typedef struct {
base_struct
super;
int value2;
} sub_struct;

Você pode então converter a nova estrutura para a antiga para acessar seus membros:

sub_struct s;
s
.value2 = 13;
((base_struct)s).value = 37;

Adicionar “métodos” é apenas um ponteiro de função em uma estrutura:

typedef struct _some_struct {
int value;
void (*set_value)(_some_struct *self, int new_value);
} some_struct;

E chamando de:

some_struct *s = {};
s
->set_value(s, 42);

Este método sempre pode ser “sobrecarregado” apenas alterando o ponteiro de função.