In my current code the reason I have an Object struct is to be common elements needed to handle collisions and movement. I can later test for collisions with all objects by running through an array of all of the objects. I haven't tested this out at all the syntax and my use of references could be wrong but this is the general idea of what I was getting at (it shows a way to have different types of monsters, I probably won't use this way of doing things but I could).
typedef struct Monster{
Object obj;
(void *) stepFunc(Monster *);
(void *) drawFunc(Monster *);
} Monster;
Monster Octorok0;
Monster Tektite0;
Monster Keaton0;
Monster_Init(&Octorok0,&Octorok_Step,&Octorok_Draw);
Monster_Init(&Tektite0,&Tektite_Step,&Tektite_Draw);
Monster_Init(&Keaton0,&Keaton_Step,&Keaton_Draw);
Monster * allMonsters[3] = {
&Octorok0,
&Tektite0,
&Keaton0
}
int i;
for (i = 0; i < 3; i++){
*allMonsters[i].stepFunc(allMonsters[i]);
*allMonsters[i].drawFunc(allMonsters[i]);
}
The Octorok_Step and the like are functions. So a Monster struct can move and be drawn in many different ways by making the Monster struct refer to different functions.