#include <stdio.h>
#define implements struct
typedef struct Hello {
void (*hello)(void*);
} Hello;
struct World {
implements Hello super;
};
void World_hello
(void* this
) { puts("Hello, World!"); }
Hello* newWorld() {
struct World
* world
= (struct World
*)malloc(sizeof(struct World
)); world->super.hello = *World_hello;
return (Hello*)world;
}
struct Greeter {
implements Hello super;
char name[255];
};
void Greeter_hello
(void* this
) { printf("Hello, %s!\n", ((struct Greeter
*)this
)->name
); }
Hello* newGreeter(char* name) {
struct Greeter
* greeter
= (struct Greeter
*)malloc(sizeof(struct Greeter
)); greeter->super.hello = *Greeter_hello;
return (Hello*)greeter;
}
void hello(Hello* object) {
object->hello(object);
}
int main() {
Hello* world = newWorld();
Hello* greeter = newGreeter("Programowanie Obiektowe");
hello(world);
hello(greeter);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIGltcGxlbWVudHMgc3RydWN0Cgp0eXBlZGVmIHN0cnVjdCBIZWxsbyB7CiAgICB2b2lkICgqaGVsbG8pKHZvaWQqKTsKfSBIZWxsbzsKCnN0cnVjdCBXb3JsZCB7CiAgICBpbXBsZW1lbnRzIEhlbGxvIHN1cGVyOwp9OwoKdm9pZCBXb3JsZF9oZWxsbyh2b2lkKiB0aGlzKSB7IHB1dHMoIkhlbGxvLCBXb3JsZCEiKTsgfQoKSGVsbG8qIG5ld1dvcmxkKCkgewogICAgc3RydWN0IFdvcmxkKiB3b3JsZCA9IChzdHJ1Y3QgV29ybGQqKW1hbGxvYyhzaXplb2Yoc3RydWN0IFdvcmxkKSk7CiAgICB3b3JsZC0+c3VwZXIuaGVsbG8gPSAqV29ybGRfaGVsbG87CgogICAgcmV0dXJuIChIZWxsbyopd29ybGQ7Cn0KCnN0cnVjdCBHcmVldGVyIHsKICAgIGltcGxlbWVudHMgSGVsbG8gc3VwZXI7CiAgICBjaGFyIG5hbWVbMjU1XTsKfTsKCnZvaWQgR3JlZXRlcl9oZWxsbyh2b2lkKiB0aGlzKSB7IHByaW50ZigiSGVsbG8sICVzIVxuIiwgKChzdHJ1Y3QgR3JlZXRlciopdGhpcyktPm5hbWUpOyB9CgpIZWxsbyogbmV3R3JlZXRlcihjaGFyKiBuYW1lKSB7CiAgICBzdHJ1Y3QgR3JlZXRlciogZ3JlZXRlciA9IChzdHJ1Y3QgR3JlZXRlciopbWFsbG9jKHNpemVvZihzdHJ1Y3QgR3JlZXRlcikpOwogICAgZ3JlZXRlci0+c3VwZXIuaGVsbG8gPSAqR3JlZXRlcl9oZWxsbzsKICAgIHN0cm5jcHkoZ3JlZXRlci0+bmFtZSwgbmFtZSwgMjU0KTsKCiAgICByZXR1cm4gKEhlbGxvKilncmVldGVyOwp9Cgp2b2lkIGhlbGxvKEhlbGxvKiBvYmplY3QpIHsKICAgIG9iamVjdC0+aGVsbG8ob2JqZWN0KTsKfQoKaW50IG1haW4oKSB7CiAgICBIZWxsbyogd29ybGQgPSBuZXdXb3JsZCgpOwogICAgSGVsbG8qIGdyZWV0ZXIgPSBuZXdHcmVldGVyKCJQcm9ncmFtb3dhbmllIE9iaWVrdG93ZSIpOwoKICAgIGhlbGxvKHdvcmxkKTsKICAgIGhlbGxvKGdyZWV0ZXIpOwogICAgCiAgICBmcmVlKHdvcmxkKTsKICAgIGZyZWUoZ3JlZXRlcik7CiAgICAKICAgIHJldHVybiAwOwp9Cg==