// CIS 235 - Review for Final fcominh.cpp // Illustrates composition and inheritance #include using std::ostream; class base { friend ostream & operator<<(ostream &, const base &); public: base(void); base(int); base(const base &); virtual ~base(); // QUESTION: Why is the destructor virtual? virtual int f2(void) const; int f1(void ) const; const base & operator = ( const base &); private: int x; }; class comp { friend ostream & operator<<(ostream &, const comp &); public: comp(void); comp(char); comp(const comp &); ~comp(); int f3(void) const; const comp & operator = ( const comp &); private: char y; }; class derived : public base { friend ostream & operator << ( ostream &, const derived &); public: derived(void); derived(int, char, double); derived( const derived &); virtual ~derived(); int f2(void) const; //REWRITE of inherited function const derived & operator = ( const derived &); int f3(void) const; private: double z; comp a; }; derived::derived(void) : base(), a() { z = 1.0; } derived::derived(int m, char n, double o) : base(m), a(n) { z = o; } derived::derived(const derived & r) : base(r), // base copy constructor, base class a( r.a) // comp copy constructor, composition { z = r.z; } int derived::f2(void) const { return 2 + (*this).base::f2(); } ostream & operator << ( ostream & w, const derived & r) { const base & q = r; w << q << ' ' // insert a base object, base class << r.a <<' ' // insert a comp object, composition << r.z ; // insert a double return w; } const derived & derived::operator =( const derived & r) { if ( this == & r ) return *this; (*this).base::operator =(r); // base class assignment a = r.a; // composition assignment z = r.z; // double assignment return *this; } int derived::f3(void) const { return a.f3(); // composition - must write the function for derived } // inheritance the function f1 is NOT written - use the inherited function