淺談C++虛重載操作符 virtual operator= 的運用辦法。本站提示廣大學習愛好者:(淺談C++虛重載操作符 virtual operator= 的運用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談C++虛重載操作符 virtual 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; }
以上就是為大家帶來的淺談C++虛重載操作符 virtual operator= 的運用辦法全部內容了,希望大家多多支持~