#include <iostream>
using namespace std;
class BaseA
{
public:
int _i;
BaseA(int i): _i(i){};
BaseA(const BaseA& rhs);
BaseA& operator=(const BaseA& rhs);
};
BaseA::BaseA(const BaseA& rhs)
{
_i = rhs._i;
}
BaseA& BaseA::operator=(const BaseA& rhs)
{
if (&rhs == this)
{
return *this;
}
this->_i = rhs._i;
return *this;
}
class DevA : public BaseA
{
public:
int _j;
DevA(int j):BaseA(j),_j(j){};
DevA(const DevA& rhs);
DevA& operator= (const DevA& rhs);
};
DevA::DevA(const DevA& rhs)
:BaseA(rhs._i)
{
this->_j = rhs._j;
}
DevA& DevA::operator =(const DevA& rhs)
{
if (&rhs == this)
{
return *this;
}
this->_j = rhs._j;
return *this;
}
int main()
{
DevA d(4);
DevA d2(5);
DevA d3(d);
DevA d4 = d2;
d = d2;
return 0;
}
我们在定义自己的拷贝构造函数和赋值函数是一定要仔细,像上述例子中其实赋值函数它没有做到真正的赋值。在执行d = d2;后由于在DevA类中的赋值函数没有对BaseA中的_i变量进行复制所以早d中的_i和d2中的_i是不相等的。
要解决上述问题我们的修改下DevA中的赋值函数。
DevA& DevA::operator =(const DevA& rhs)
{
if (&rhs == this)
{
return *this;
}
static_cast<BaseA&>(*this) = rhs;
this->_j = rhs._j;
return *this;
}
只需改成上述一样即可。
在我们执行这样的语句时:DevA d3 = d;他的执行过程是先调用d3的拷贝构造函数在调用d3的赋值函数。