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; }
以上就是小編為大家帶來的淺談C++虛重載操作符 virtual operator= 的使用方法全部內容了,希望大家多多支持VEVB武林網~
新聞熱點
疑難解答