SHOW:
|
|
- or go back to the newest paste.
| 1 | #include <stdio.h> | |
| 2 | ||
| 3 | /////////////////////////////////////// | |
| 4 | // Base | |
| 5 | ||
| 6 | typedef struct _base | |
| 7 | {
| |
| 8 | char*(*GetName)(struct _base*); | |
| 9 | char* name; | |
| 10 | } Base; | |
| 11 | ||
| 12 | char* base_get_name(Base* base) | |
| 13 | {
| |
| 14 | return base->name; | |
| 15 | } | |
| 16 | ||
| 17 | void base_init(Base* base, char* name) | |
| 18 | {
| |
| 19 | base->name = name; | |
| 20 | base->GetName = &base_get_name; | |
| 21 | } | |
| 22 | ||
| 23 | /////////////////////////////////////// | |
| 24 | // Derived | |
| 25 | ||
| 26 | typedef struct | |
| 27 | {
| |
| 28 | // by making the parent struct the first data member | |
| 29 | // of the derived struct, a `Derived*` can be cast into | |
| 30 | // a `Base*` for pseudo-polymorphism; however, you lose | |
| 31 | // out on static type checking because of this cast, so | |
| 32 | // an `int*` passed in will cause a crash at runtime | |
| 33 | Base Base; | |
| 34 | } Derived; | |
| 35 | ||
| 36 | char* derived_get_name(Base* derived) | |
| 37 | {
| |
| 38 | return "derived"; | |
| 39 | } | |
| 40 | ||
| 41 | void derived_init(Derived* derived) | |
| 42 | {
| |
| 43 | derived->Base.name = ""; | |
| 44 | derived->Base.GetName = &derived_get_name; | |
| 45 | } | |
| 46 | ||
| 47 | ////////////////////////////////////// | |
| 48 | // Functions | |
| 49 | ||
| 50 | void PrintName(Base* base) | |
| 51 | {
| |
| 52 | printf("%s\n", base->GetName(base));
| |
| 53 | - | Base* bPtr = &b; |
| 53 | + | |
| 54 | - | base_init(bPtr, "base"); |
| 54 | + | |
| 55 | - | PrintName(bPtr); |
| 55 | + | |
| 56 | {
| |
| 57 | Base b; | |
| 58 | - | Derived* dPtr = &d; |
| 58 | + | base_init(&b, "base"); |
| 59 | - | derived_init(dPtr); |
| 59 | + | PrintName(&b); |
| 60 | ||
| 61 | - | PrintName((Base*)(dPtr)); |
| 61 | + | |
| 62 | derived_init(&d); | |
| 63 | PrintName((Base*)(&d)); | |
| 64 | ||
| 65 | ||
| 66 | // This would compile (because the cast breaks static | |
| 67 | // type checking), but crash: | |
| 68 | // int i = 40; | |
| 69 | // PrintName((Base*)(&i); | |
| 70 | ||
| 71 | return 0; | |
| 72 | } | |
| 73 | ||
| 74 | // output: | |
| 75 | // base | |
| 76 | // derived |