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;
}
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.