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

来源:互联网 发布:gta5人物捏脸数据美女 编辑:程序博客网 时间:2024/06/04 18:17

  • 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

原创粉丝点击