-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstaticpoly.cpp
More file actions
111 lines (92 loc) · 1.83 KB
/
staticpoly.cpp
File metadata and controls
111 lines (92 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
using namespace std;
//dynamic polymorphism won't work below
namespace bad_code
{
struct Base
{
Base() { OnConstruct(); }
virtual ~Base() { OnDestruct(); }
virtual void OnConstruct() { cout << "ERROR: Unexpected call to Base!\n"; }
virtual void OnDestruct() { cout << "ERROR: Unexpected call to Base!\n"; }
};
struct Foo : public Base
{
virtual void OnConstruct() override
{
cout << "Foo Created\n";
}
virtual void OnDestruct() override
{
cout << "Foo Destroyed\n";
}
};
struct Bar : public Base
{
virtual void OnConstruct() override
{
cout << "Bar Created\n";
}
virtual void OnDestruct() override
{
cout << "Bar Destroyed\n";
}
};
}
//static polymorphism implementation using CRTP
namespace good_code
{
template<class DERIVED>
struct Base
{
//WARNING: OnConstruct is called BEFORE the derived class's construction
//WARNING: OnConstruct is called BEFORE the derived class's construction
Base()
{
DERIVED::OnConstruct(static_cast<DERIVED&>(*this));
}
~Base()
{
DERIVED::OnDestruct(static_cast<DERIVED&>(*this));
}
};
struct Foo : public Base<Foo>
{
static void OnConstruct(Foo& self)
{
cout << "Foo Being Created\n";
}
static void OnDestruct(Foo& self)
{
cout << "Foo Destroyed\n";
}
};
struct Bar : public Base<Bar>
{
static void OnConstruct(Bar& self)
{
cout << "Bar Being Created\n";
}
static void OnDestruct(Bar& self)
{
cout << "Bar Destroyed\n";
}
};
}
int main()
{
cout << "bad code:\n";
{
bad_code::Foo foo;
bad_code::Bar bar;
}
cout << endl;
cout << "good code:\n";
{
good_code::Foo foo;
good_code::Bar bar;
}
cout << endl;
cin.get();
return 0;
}