//: C09:VirtualBase.cpp // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. // Shows a shared subobject via a virtual base. #include using namespace std; class Top { protected: int x; public: Top(int n) { x = n; } virtual ~Top() {} friend ostream& operator<<(ostream& os, const Top& t) { return os << t.x; } }; class Left : virtual public Top { protected: int y; public: Left(int m, int n) : Top(m) { y = n; } }; class Right : virtual public Top { protected: int z; public: Right(int m, int n) : Top(m) { z = n; } }; class Bottom : public Left, public Right { int w; public: Bottom(int i, int j, int k, int m) : Top(i), Left(0, j), Right(0, k) { w = m; } friend ostream& operator<<(ostream& os, const Bottom& b) { return os << b.x << ',' << b.y << ',' << b.z << ',' << b.w; } }; int main() { Bottom b(1, 2, 3, 4); cout << sizeof b << endl; cout << b << endl; cout << static_cast(&b) << endl; Top* p = static_cast(&b); cout << *p << endl; cout << static_cast(p) << endl; cout << dynamic_cast(p) << endl; } ///:~