首先,看下面的代码的输出时什么:
#include
using namespace std;
class Base
{
public:
Base &operator=(const Base &rhs)
{
cout << "operator= in Base..." << endl;
}
virtual ~Base(){}
};
class Derived:public Base
{
public:
Derived &operator=(const Derived &rhs)
{
cout << "operator= in Derived..." << endl;
}
~Derived(){}
};
int main()
{
Derived d1,d2;
d1 = d2;
Base *p1 = &d1;
Base *p2 = &d2;
*p1 = *p2;
return 0;
}
上述代码做了最理所当然的事,就是将Derived的两个对象进行了交换。但是通过指针进行的赋值输出却不是预期的:
竟然调用的是Base的operator=,也就意味着我们把d2的Base部分赋值给了d1,而现在的d1就是“一般是自己的derived,一半是d2的Base”的怪物啦!!!
看来编译器没有理会我们的意图,对于这样的指针赋值都不能如愿,于是,我们需要的是动态类型,那么,我们可以将 “operator=虚化”。
#include
using namespace std;
class Base
{
public:
virtual Base &operator=(const Base &rhs)
{
cout << "operator= in Base..." << endl;
}
virtual ~Base(){}
};
class Derived:public Base
{
public:
Derived &operator=(const Base &rhs)
{
cout << "operator= in Derived..." << endl;
}
~Derived(){}
};
int main()
{
Derived d1,d2;
d1 = d2;
Base *p1 = &d1;
Base *p2 = &d2;
*p1 = *p2;
return 0;
}
但是通过指针复制通过了,但是一般的对象赋值却莫名其妙了。
于是乎,添加对象本身的赋值操作符也是很有必要的,像下面这样:
#include
using namespace std;
class Base
{
public:
virtual Base &operator=(const Base &rhs)
{
cout << "operator= in Base..." << endl;
}
virtual ~Base(){}
};
class Derived:public Base
{
public:
Derived &operator=(const Base &rhs)
{
cout << "operator= in Derived..." << endl;
}
Derived &operator=(const Derived &rhs)
{
cout << "operator= in Derived non virtual..." << endl;
}
~Derived(){}
};
int main()
{
Derived d1,d2;
d1 = d2;
Base *p1 = &d1;
Base *p2 = &d2;
*p1 = *p2;
return 0;
}
结果为:
OK 大功告成,但是这只是其中的一小步。对于多重继承的情况,上述的代码又会出现一些令人费解的答案:
[to be continued]