Os desenvolvedores hoje contam com inúmeras linguagens orientadas à objeto, como Java, Python, Ruby, Javascript. Mas como isso funciona, acho que boa parte dos desenvolvedores já fizeram esta pergunta e não souberam responder. Realizando algumas buscas descobri como métodos são adicionados em uma estrutura em C, linguagem base para desenvolvimento de interpretadores e compiladores de linguagens orientadas a objeto.

#include <stdio.h>

void name(){
    printf("Rex");
}

typedef struct{
    char *_name;
    void (*name)(void);
}Animal;


int main()
{

    Animal dog;
    dog.name = &name;
    dog.name();

    return 0;
}