Ticket #2563: Main.cpp

File Main.cpp, 2.4 KB (added by jacobholm@…, 14 years ago)

static_cast test

Line 
1#define BOOST_TEST_MODULE Serialization
2
3#include <boost/test/test_tools.hpp>
4#include <boost/test/included/unit_test.hpp>
5
6class Base1
7{
8 int
9 m_i1;
10
11protected:
12
13 Base1() : m_i1(1)
14 { }
15
16 ~Base1()
17 { }
18
19};
20
21class Base2
22{
23 double
24 m_i2;
25
26protected:
27
28 Base2() : m_i2(2)
29 { }
30
31 ~Base2()
32 { }
33
34};
35
36class Derived1 : public Base1, public Base2
37{
38 double
39 m_d1;
40public:
41
42 Derived1(
43 ) : m_d1(1.0)
44 {}
45
46};
47
48class Derived2 : public Base2, public Base1
49{
50 double
51 m_d2;
52public:
53
54 Derived2(
55 ) : m_d2(1.0)
56 {}
57};
58
59class Derived : public Base1
60{
61 double
62 m_d;
63public:
64
65 Derived(
66 ) : m_d(0.0)
67 {}
68};
69
70BOOST_AUTO_TEST_SUITE(Serialization)
71
72 BOOST_AUTO_TEST_CASE(pointerTest)
73 {
74 // Declare the derived objects
75 Derived
76 d;
77 Derived1
78 d1;
79 Derived2
80 d2;
81
82 // Assign the derived objects to void pointers
83 void
84 *pVoidD = &d,
85 *pVoidD1 = &d1,
86 *pVoidD2 = &d2;
87
88 // Cast the void pointers back to their derived types,
89 // and assign them to Base1 pointers
90 Base1
91 *pB = static_cast<Derived*>(pVoidD),
92 *pB1 = static_cast<Derived1*>(pVoidD1),
93 *pB2 = static_cast<Derived2*>(pVoidD2);
94
95 // Cast the Base1 pointers back to the respective derived type,
96 // and assign them to the derived pointers
97 Derived
98 *pD = static_cast<Derived*>(pB);
99 Derived1
100 *pD1 = static_cast<Derived1*>(pB1);
101 Derived2
102 *pD2 = static_cast<Derived2*>(pB2);
103
104 // Cast the processed derived pointers to integers, for easier comparison
105 unsigned long long
106 iD = reinterpret_cast<unsigned long long>(pD),
107 iD1 = reinterpret_cast<unsigned long long>(pD1),
108 iD2 = reinterpret_cast<unsigned long long>(pD2),
109 iB = reinterpret_cast<unsigned long long>(pB),
110 iB1 = reinterpret_cast<unsigned long long>(pB1),
111 iB2 = reinterpret_cast<unsigned long long>(pB2);
112
113 BOOST_REQUIRE(iD == iB); // We expect that Derived is equal to Base1
114 BOOST_REQUIRE(iD1 == iB1); // We expect that Derived1 is equal to Base1
115 BOOST_REQUIRE(iD2 != iB2); // We expect that Derived2 is NOT equal to Base1,
116 // since it inherits from Base2, Base1, respectively, it will be equal to Base2
117
118 // This means that if using static_cast one can use multiple inheritance
119 }
120
121BOOST_AUTO_TEST_SUITE_END()