#include <stdio.h>
#include <stdlib.h>
typedef struct _Animal Animal;
struct _Animal {
const char *name;
void (*play)(Animal *);
};
typedef struct _Dog Dog;
struct _Dog {
Animal animal;
};
void playDog(Animal *dog) {
printf("わんわん!%sだよ\n", ((Dog
*)dog
)->animal.
name); }
Animal *newDog(const char *name) {
Dog
*dog
= (Dog
*)malloc(sizeof(Dog
)); dog->animal.name = name;
dog->animal.play = playDog;
return (Animal *)dog;
}
typedef struct _Cat Cat;
struct _Cat {
Animal animal;
int sleep;
};
void playCat(Animal *cat) {
printf("にゃあ!%sだよ\n", ((Cat
*)cat
)->animal.
name); if(((Cat *)cat)->sleep == 1) {
}
}
Animal *newCat(const char *name, int sleep) {
Cat
*cat
= (Cat
*)malloc(sizeof(Cat
)); cat->animal.name = name;
cat->animal.play = playCat;
cat->sleep = sleep;
return (Animal *)cat;
}
int main(int argc, char *argv[])
{
int i;
Animal *pets[] = {
newDog("ぽち"),
newCat("たま", 1)
};
for(i = 0; i < (sizeof pets / sizeof pets[0]); i++) {
pets[i]->play(pets[i]);
}
for(i = 0; i < (sizeof pets / sizeof pets[0]); i++) {
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IF9BbmltYWwgQW5pbWFsOwpzdHJ1Y3QgX0FuaW1hbCB7CiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgdm9pZCAoKnBsYXkpKEFuaW1hbCAqKTsKfTsKCnR5cGVkZWYgc3RydWN0IF9Eb2cgRG9nOwpzdHJ1Y3QgX0RvZyB7CiAgICBBbmltYWwgYW5pbWFsOwp9OwoKdm9pZCBwbGF5RG9nKEFuaW1hbCAqZG9nKSB7CiAgICBwcmludGYoIuOCj+OCk+OCj+OCk++8gSVz44Gg44KIXG4iLCAoKERvZyAqKWRvZyktPmFuaW1hbC5uYW1lKTsKfQoKQW5pbWFsICpuZXdEb2coY29uc3QgY2hhciAqbmFtZSkgewogICAgRG9nICpkb2cgPSAoRG9nICopbWFsbG9jKHNpemVvZihEb2cpKTsKICAgIGRvZy0+YW5pbWFsLm5hbWUgPSBuYW1lOwogICAgZG9nLT5hbmltYWwucGxheSA9IHBsYXlEb2c7CgogICAgcmV0dXJuIChBbmltYWwgKilkb2c7Cn0KCnR5cGVkZWYgc3RydWN0IF9DYXQgQ2F0OwpzdHJ1Y3QgX0NhdCB7CiAgICBBbmltYWwgYW5pbWFsOwogICAgaW50IHNsZWVwOwp9OwoKdm9pZCBwbGF5Q2F0KEFuaW1hbCAqY2F0KSB7CiAgICBwcmludGYoIuOBq+OCg+OBgu+8gSVz44Gg44KIXG4iLCAoKENhdCAqKWNhdCktPmFuaW1hbC5uYW1lKTsKICAgIGlmKCgoQ2F0ICopY2F0KS0+c2xlZXAgPT0gMSkgewogICAgICAgIHByaW50ZigiLi4u44Gn44KC5a+d44KLXG4iKTsKICAgIH0KfQoKQW5pbWFsICpuZXdDYXQoY29uc3QgY2hhciAqbmFtZSwgaW50IHNsZWVwKSB7CiAgICBDYXQgKmNhdCA9IChDYXQgKiltYWxsb2Moc2l6ZW9mKENhdCkpOwogICAgY2F0LT5hbmltYWwubmFtZSA9IG5hbWU7CiAgICBjYXQtPmFuaW1hbC5wbGF5ID0gcGxheUNhdDsKICAgIGNhdC0+c2xlZXAgICAgICAgPSBzbGVlcDsKCiAgICByZXR1cm4gKEFuaW1hbCAqKWNhdDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgaW50IGk7CiAgICBBbmltYWwgKnBldHNbXSA9IHsKICAgICAgICBuZXdEb2coIuOBveOBoSIpLAogICAgICAgIG5ld0NhdCgi44Gf44G+IiwgMSkKICAgIH07CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiBwZXRzIC8gc2l6ZW9mIHBldHNbMF0pOyBpKyspIHsKICAgICAgICBwZXRzW2ldLT5wbGF5KHBldHNbaV0pOwogICAgfQoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgcGV0cyAvIHNpemVvZiBwZXRzWzBdKTsgaSsrKSB7CiAgICAgICAgZnJlZShwZXRzW2ldKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==