Search code examples
c++constructorassignment-operator

Inheritance with assignment operator in c++


My question is why this line still works without assignment operator ( = operator) in derived class (which is UpperCaseString class):

UC1 = WCS_String("Test2");

The WCS_String file contains implementations for Concat, ToUpper, operator[] and operator= for class WCS_String.

Code :

#include <WCS_String.h>
#include <iostream>

using namespace std;

class UpperCaseString: public WCS_String
{
public:
    UpperCaseString();
    UpperCaseString(const UpperCaseString &);
    UpperCaseString(const WCS_String &);

    ~UpperCaseString();
    istream & Read(istream & = cin);

private:
    UpperCaseString &ToLower();
};

inline istream & operator>>(istream & in, UpperCaseString & UC)
{
    UC.Read(in);
}

UpperCaseString::UpperCaseString() { }
UpperCaseString::UpperCaseString( const UpperCaseString & UC ) : WCS_String(UC) { }
UpperCaseString::UpperCaseString( const WCS_String & Str ): WCS_String (Str)
{
    ToUpper();
}

UpperCaseString::~UpperCaseString() { }

istream & UpperCaseString::Read(istream & in)
{
    WCS_String::Read(in);
    ToUpper();
    return in;
}

int main()
{
    WCS_String       Str1("Test1");
    UpperCaseString  UC1(Str1);   // Even if I changed this to UpperCaseString UC1, it still works.
    UpperCaseString  UC2(UC1);
    UpperCaseString  UC3(Str1);
    UpperCaseString  UC4(WCS_String ("Test2"));

    UC1 = WCS_String("Test2");  // This works even I don't have assignment operator to assign base class object to derived class object
    UC1 = UC4;   // This works since there will be an implicit defined assignment operator
    cout << "UC1 is " << UC1 << endl;

    UC2 = Str1;
    cout << "UC2 is " << UC2 << endl;
    UC2.Concat(UC1);    // Concat is in WCS_String file
    cout << "UC2 is " << UC2 << endl;
    UC2.Concat(WCS_String("Test2"));
    cout << "UC2 is " << UC2 << endl;
    UC2 [4] = 'a';              // [] operator is in WCS_String file.
    cout << "UC2 is " << UC2 << endl;
    UC3.ToUpper ();       // ToUpper is in WCS_String file.
    cout << "UC3 is " << UC3 << endl;

    return 0;
}

Solution

  • UpperCaseString has an assignment operator from UpperCaseString (the compiler-generated copy assignment). It also has a converting (single-argument, non-explicit) constructor from WCS_String. The compiler will happily use the latter to convert the right hand side of the assignment so it can call the former.