C++ 虚 重载操作符 virtual operator= 使用方法

本文探讨了C++中虚操作符的使用方法及其注意事项,特别是对于赋值操作符operator=的重载。文章通过实例代码展示了如何在派生类中正确地重定义基类的虚操作符以实现动态绑定,同时解释了为何需要特定类型的参数。

  • C++中虚操作符和其他虚函数的规则一样,操作符可以为虚函数,进行动态绑定, 虽然这种情况并不多见。本文以赋值操作符operator=举例。
  • 派生类中要重定义基类虚函数,要注意参数必须为基类引用类型,否则与基类中虚函数是完全不同的,无法进行预期的动态绑定。
  • 派生类除了重定义基类的虚操作符,还要定义自身的操作符重载。即派生层次每增加一层,理论上派生类就需要多定义一个操作符重载。

以下程序使用引用reference,通过指针调用赋值操作符(例:*p = value)情况是一样的。

#include <iostream> 
using namespace std; 
                             
class Base 
{ 
public: 
    virtual Base& operator=(const Base& rhs)  //重载操作符可设为virtual 
    { 
        cout << "Base" << endl; 
        return *this; 
    } 
}; 
                             
class Derived : public Base 
{ 
public: 
    //与基类的operator=完全不同,不是重新定义,不会动态绑定。 
    //如果不定义该操作符,会自动合成一个,并自动调用基类的operator=,不会动态绑定 
    Derived& operator=(const Derived& rhs)   
    { 
        cout << "Derived_D" << endl; 
        return *this; 
    } 
                             
    //重新定义基类的operator=,会动态绑定 
    //virtual Base& operator=(const Base& rhs)  //返回值两种都可以 
    virtual Derived& operator=(const Base& rhs)   
    { 
        cout << "Derived_B" << endl; 
        return *this; 
    } 
}; 
                             
class Derived2 : public Derived 
{ 
    //此类需要3个operator= 
    //可定义private的copy函数,由3个operator=调用 
    //可使用dynamic_cast将基类引用参数转为子类,并捕获异常。 
    //如果未发生异常,则调用copy,发生异常则不需赋值 
}; 
                             
int main() 
{ 
    Base b1, b2; 
    Derived d1, d2; 
                             
    Derived &rd = d1; 
                             
    Base &rb1 = b1;  //动态类型为Base 
    Base &rb2 = d2;  //动态类型为Derived 
                                 
    rb1 = d1;  //输出"Base" 
    rb2 = d2;  //输出"Derived_B" 
                             
    rb1 = rb2;  //输出"Base" 
    rb2 = rb1;  //输出"Derived_B" 
                             
    rd = d1;  //输出"Derived_D" 
    rd = b1;  //输出"Derived_B" 
                                 
    getchar(); 
    return 0; 
}

参考 http://stackoverflow.com/questions/669818/virtual-assignment-operator-c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值