在c ++中使用赋值运算符进行继承

时间:2014-12-10 19:27:22

标签: c++ constructor assignment-operator

我的问题是为什么这一行在派生类(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;
}

1 个答案:

答案 0 :(得分:0)

UpperCaseString有一个来自UpperCaseString的赋值运算符(编译器生成的拷贝赋值)。它还有一个来自WCS_String的转换(单参数,非显式)构造函数。编译器很乐意使用后者来转换赋值的右侧,以便它可以调用前者。

相关问题