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

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

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

[cpp]  view plain  copy
  1. #include <iostream>   
  2. using namespace std;   
  3.                                
  4. class Base   
  5. {   
  6. public:   
  7.     virtual Base& operator=(const Base& rhs)  //重载操作符可设为virtual   
  8.     {   
  9.         cout << "Base" << endl;   
  10.         return *this;   
  11.     }   
  12. };   
  13.                                
  14. class Derived : public Base   
  15. {   
  16. public:   
  17.     //与基类的operator=完全不同,不是重新定义,不会动态绑定。   
  18.     //如果不定义该操作符,会自动合成一个,并自动调用基类的operator=,不会动态绑定   
  19.     Derived& operator=(const Derived& rhs)     
  20.     {   
  21.         cout << "Derived_D" << endl;   
  22.         return *this;   
  23.     }   
  24.                                
  25.     //重新定义基类的operator=,会动态绑定   
  26.     //virtual Base& operator=(const Base& rhs)  //返回值两种都可以   
  27.     virtual Derived& operator=(const Base& rhs)     
  28.     {   
  29.         cout << "Derived_B" << endl;   
  30.         return *this;   
  31.     }   
  32. };   
  33.                                
  34. class Derived2 : public Derived   
  35. {   
  36.     //此类需要3个operator=   
  37.     //可定义private的copy函数,由3个operator=调用   
  38.     //可使用dynamic_cast将基类引用参数转为子类,并捕获异常。   
  39.     //如果未发生异常,则调用copy,发生异常则不需赋值   
  40. };   
  41.                                
  42. int main()   
  43. {   
  44.     Base b1, b2;   
  45.     Derived d1, d2;   
  46.                                
  47.     Derived &rd = d1;   
  48.                                
  49.     Base &rb1 = b1;  //动态类型为Base   
  50.     Base &rb2 = d2;  //动态类型为Derived   
  51.                                    
  52.     rb1 = d1;  //输出"Base"   
  53.     rb2 = d2;  //输出"Derived_B"   
  54.                                
  55.     rb1 = rb2;  //输出"Base"   
  56.     rb2 = rb1;  //输出"Derived_B"   
  57.                                
  58.     rd = d1;  //输出"Derived_D"   
  59.     rd = b1;  //输出"Derived_B"   
  60.                                    
  61.     getchar();   
  62.     return 0;   
  63. }  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值