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 |