is that it is already too messy. If the only thing that makes instances different is the particular values of some data, you don't need "subclasses" at all.
Code:
struct animal
{
char sound[32];
char food[32];
};
void animal_construct(animal* this, const char* sound, const char* food)
{
strcpy(this->sound, sound);
strcpy(this->food, food);
}
function animal_speak (struct animal *ptr) {
say ptr->sound;
}
struct animal my_dog dog;
struct animal my_cat cat;
animal_construct(&dog, "woof woof", "cat");
animal_construct(&cat, "purr", "mouse");
animal_speak(&dog);
animal_speak(&cat);
See, infinite number of different animals is possible without stupid amounts of code.
Now, what if indeed different classes needed to do different things, rather than have different data?