// Purpose. Inheritance run amok #include using std::cout; class A { public: virtual void doIt() { cout << 'A'; } }; class AwithX : public A { void doX() { cout << 'X'; } public: /*virtual*/ void doIt() { A::doIt(); doX(); } }; class AwithY : public A { protected: void doY() { cout << 'Y'; } public: /*virtual*/ void doIt() { A::doIt(); doY(); } }; class AwithZ : public A { protected: void doZ() { cout << 'Z'; } public: /*virtual*/ void doIt() { A::doIt(); doZ(); } }; class AwithXY : public AwithX, public AwithY { public: /*virtual*/ void doIt() { AwithX::doIt(); AwithY::doY(); } }; class AwithXYZ : public AwithX, public AwithY, public AwithZ { public: /*virtual*/ void doIt() { AwithX::doIt(); AwithY::doY(); AwithZ::doZ(); } }; void main( void ) { AwithX anX; AwithXY anXY; AwithXYZ anXYZ; anX.doIt(); cout << '\n'; anXY.doIt(); cout << '\n'; anXYZ.doIt(); cout << '\n'; } // AX // AXY // AXYZ #if 0 // Purpose. Replacing inheritance with wrapping-delegation class I { public: virtual ~I() { } virtual void doIt() = 0; }; class A : public I { public: ~A() { cout << "A dtor" << '\n'; } /*virtual*/ void doIt() { cout << 'A'; } }; class D : public I { I* wrappee; public: D( I* inner ) { wrappee = inner; } ~D() { delete wrappee; } /*virtual*/ void doIt() { wrappee->doIt(); } }; class X : public D { public: X( I* core ) : D(core) { } ~X() { cout << "X dtor" << " "; } /*virtual*/ void doIt() { D::doIt(); cout << 'X'; } }; class Y : public D { public: Y( I* core ) : D(core) { } ~Y() { cout << "Y dtor" << " "; } /*virtual*/ void doIt() { D::doIt(); cout << 'Y'; } }; class Z : public D { public: Z( I* core ) : D(core) { } ~Z() { cout << "Z dtor" << " "; } /*virtual*/ void doIt() { D::doIt(); cout << 'Z'; } }; void main( void ) { I* anX = new X( new A ); I* anXY = new Y( new X( new A ) ); I* anXYZ = new Z( new Y( new X( new A ) ) ); I* anXYZYX = new X( new Y( new Z( new Y( new X( new A ))))); anX->doIt(); cout << '\n'; anXY->doIt(); cout << '\n'; anXYZ->doIt(); cout << '\n'; anXYZYX->doIt(); cout << '\n'; delete anX; delete anXY; delete anXYZ; delete anXYZYX; } // AX // AXY // AXYZ // AXYZYX // X dtor A dtor // Y dtor X dtor A dtor // Z dtor Y dtor X dtor A dtor // X dtor Y dtor Z dtor Y dtor X dtor A dtor #endif