struct point
{
int x;
int y;
void (*print)(const struct point*);
};
Det här är ett jättedåligt sätt att göra polymorfism i C, av flera anledningar.
Vi börjar med effektivitet. Det är relevant eftersom du skriver att du vill använda C för att skapa kompakt kod med små systemkrav.
Under kategorin effektivitet börjar vi med minne. Att behöva använda RAM-minne för att lagra instruktionspekare, och då dessutom i varenda objekt skalar inte särskilt väl. I ditt exempel har du bara en funktion, men i något som vore mer än ett leksaksexempel så hade du haft fler funktioner.
Om du har många instanser av denna datastruktur så blir detta rätt mycket minne över tid. Du kör kanske inte slut på ditt RAM-minne, däremot kanske du får använda ett långsammare cache i din CPU, eller inget cache alls, vilket gör att din (begränsade) CPU inte kan jobba lika snabbt.
Sen får vi inte glömma alla möjligheter att göra fel på. Varje gång du skapar ett objekt måste du komma ihåg att uppdatera denna tabell med pekare. Vilket också gör det dyrare CPU-mässigt att skapa nya objekt. Helt i onödan ofta.
Detta kan man mitigera delvis genom att skapa ett "klassobjekt" som man pekar till som innehåller en tabell med funktioner. Det är också ungefär så som t.ex. C++ implementerar "virtuella metoder" i verkligheten.
Med det sagt så är det inte polymorfism som du egentligen verkar vara ute efter, utan mer ett sätt att organisera sig.
För att svara på det som egentligen verkar vara kärnan till ditt problem, hur organiserar man sin kod på ett bra sätt i C? Ett bra sätt att tänka på är att läsa på om modulär programmering. Det går ut på att man delar upp sitt program i små beståndsdelar, med väl definierade gränssnittsytor mellan modulerna.