As opposed to base class’ constructor and destructor, which are automatically invoked from the derived class’ constructor and destructor respectively, a user-defined assignment operator defined in a base class is overridden – rather than being extended – when re-defined in a derived class. In order to extend the assignment operator in a derived class, one has first to invoke the base’s assignment operator explicitly, and then add the assignment operations required for the derived class.
class C {char *p; public: enum {size = 10}; //size serves as a constant const char * Getp() const {return p;} C() : p ( new char [size] ) {}C& operator = (const C& other) {if (this != &other) strcpy(p, other.Getp() ); return *this;} //...destructor and copy constructor};class D : public C { char *q;public: const char * Getq() const {return q;} D(): q ( new char [size] ) {}D& operator = (const D& other) { if (this != &other) C::operator=(other); //first invoke base's assignment operator explicitly strcpy(q, (other.Getq())); //add extensions here return *this;} //...destructor and copy constructor};