我的问题是为什么这一行在派生类(UpperCaseString
类)中没有赋值运算符(=运算符)的情况下仍然有效:
UC1 = WCS_String("Test2");
WCS_String文件包含针对类WCS_String的Concat,ToUpper,operator []和operator =的实现。
代码:
#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;
}
答案 0 :(得分:0)
UpperCaseString有一个来自UpperCaseString的赋值运算符(编译器生成的拷贝赋值)。它还有一个来自WCS_String的转换(单参数,非显式)构造函数。编译器很乐意使用后者来转换赋值的右侧,以便它可以调用前者。