1 | int main(int argc, char** argv) |
2 | { |
3 | struct A { |
4 | int a_; |
5 | } a{.a_: 1}; |
6 | |
7 | struct B { |
8 | int b_; |
9 | } b{.b_: 2}; |
10 | |
11 | struct C : A, B { |
12 | int c_; |
13 | } c; |
14 | // } c{{1}, {2}, 3}; |
15 | c.a_ = 1; |
16 | c.b_ = 2; |
17 | c.c_ = 3; |
18 | |
19 | struct D : C { |
20 | int d_; |
21 | A fa_; |
22 | } d; |
23 | // } d{{{1}, {2}, 3}, 4, {5}}; |
24 | d.a_ = 1; |
25 | d.b_ = 2; |
26 | d.c_ = 3; |
27 | d.d_ = 4; |
28 | d.fa_.a_ = 5; |
29 | |
30 | // Virtual inheritance example. |
31 | struct Animal { |
32 | virtual ~Animal() = default; |
33 | int weight_; |
34 | }; |
35 | struct Mammal : virtual Animal {}; |
36 | struct WingedAnimal : virtual Animal {}; |
37 | struct Bat : Mammal, WingedAnimal { |
38 | } bat; |
39 | bat.weight_ = 10; |
40 | |
41 | // Empty bases example. |
42 | struct IPlugin { |
43 | virtual ~IPlugin() {} |
44 | }; |
45 | struct Plugin : public IPlugin { |
46 | int x; |
47 | int y; |
48 | }; |
49 | Plugin plugin; |
50 | plugin.x = 1; |
51 | plugin.y = 2; |
52 | |
53 | struct ObjectBase { |
54 | int x; |
55 | }; |
56 | struct Object : ObjectBase {}; |
57 | struct Engine : Object { |
58 | int y; |
59 | int z; |
60 | }; |
61 | |
62 | Engine engine; |
63 | engine.x = 1; |
64 | engine.y = 2; |
65 | engine.z = 3; |
66 | |
67 | // Empty multiple inheritance with empty base. |
68 | struct Base { |
69 | int x; |
70 | int y; |
71 | virtual void Do() = 0; |
72 | virtual ~Base() {} |
73 | }; |
74 | struct Mixin {}; |
75 | struct Parent : private Mixin, public Base { |
76 | int z; |
77 | virtual void Do(){}; |
78 | }; |
79 | Parent obj; |
80 | obj.x = 1; |
81 | obj.y = 2; |
82 | obj.z = 3; |
83 | Base* parent_base = &obj; |
84 | Parent* parent = &obj; |
85 | |
86 | return 0; // Set a breakpoint here |
87 | } |
88 | |