淺談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= 的運用辦法全部內容了,希望大家多多支持~