operator= 复制操作符的意外

首先,看下面的代码的输出时什么:

#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]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值