#include #include typedef struct Animal { char *name; int age; void (*talk) (struct Animal*); } Animal; typedef struct Dog { struct Animal base; // Dog "extends" Animal bool bites; } Dog; typedef struct Bird { struct Animal base; // Bird "extends" Animal void (*fly) (struct Bird*,int); } Bird; typedef struct Parrot { struct Bird base; // Parrot "extends" Bird enum { ROJO, VERDE, AMARILLO } color_plumas; char *frase; } Parrot; /// Animal "Interface" /////////////////////////// void cat_meow(Animal *animal){ printf("[Cat] Meow! my name is %s\n", animal->name); } void dog_bark(Animal *animal){ Dog *d = (Dog*) animal; printf("[Dog] Woof! my name is %s and I %sbite\n", animal->name, d->bites ? "" : "don't "); } void parrot_talk(Animal *animal){ Parrot *l = (Parrot*) animal; printf("[Parrot] %s says: \"%s\"\n", animal->name, l->frase); } void bird_talk(Animal *animal) { printf("[Bird] Tweep! my name is %s\n", animal->name); } /// Bird "Interface" ///////////////////////////// void bird_fly(struct Bird *bird, int n){ printf("%s flies: ", bird->base.name); for (int i = 0; i < n; i++){ printf("."); } printf("\n"); } void parrot_fly(struct Bird *bird, int n){ printf("%s flies: ", bird->base.name); for (int i = 0; i < n; i++){ printf("*"); } printf("\n"); } ////////////////////////////////////////////////// void say_hi(Animal **animals){ printf("*The animals say hi*\n"); while (*animals){ (*animals)->talk(*animals); animals++; } } void fly_birds(Bird **birds, int *args){ printf("*The birds fly*\n"); while (*birds){ (*birds)->fly(*birds, *args++); birds++; } } int main(){ Animal cat = {.name = "Felix", .talk = cat_meow}; Dog dog = { .base = (Animal){ .name = "Fido", .talk = dog_bark }, .bites = false }; Parrot parrot = { .base = (Bird){ .base = (Animal){ .name = "Perry", .talk = parrot_talk }, .fly = parrot_fly }, .frase = "I'm so colorful!" }; Bird bird = { .base = (Animal){ .name = "Pigelton", .talk = bird_talk }, .fly = bird_fly }; Animal *arr[120] = {&cat, (Animal*)&dog, (Animal*)&parrot, (Animal*)&bird, NULL}; say_hi(arr); printf("\n"); Bird *bird_arr[120] = {&bird, (Bird*)&parrot, NULL}; int args[] = {12, 20}; fly_birds(bird_arr, args); return 0; }