淺談C++重載、重寫、重界說。本站提示廣大學習愛好者:(淺談C++重載、重寫、重界說)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談C++重載、重寫、重界說正文
1、重載(overload)
指函數名雷同,然則它的參數表列個數或次序,類型分歧。然則不克不及靠前往類型來斷定。
(1)雷同的規模(在統一個感化域中) ;
(2)函數名字雷同;
(3)參數分歧;
(4)virtual 症結字無關緊要。
(5)前往值可以分歧;
2、重寫(也稱為籠罩 override)
是指派生類從新界說基類的虛函數,特點是:
(1)不在統一個感化域(分離位於派生類與基類) ;
(2)函數名字雷同;
(3)參數雷同;
(4)基類函數必需有 virtual 症結字,不克不及有 static 。
(5)前往值雷同(或是協變),不然報錯;<—-協變這個概念我也是第一次才曉得…
(6)重寫函數的拜訪潤飾符可以分歧。雖然 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的
3、重界說(同樣成隱蔽)
(1)不在統一個感化域(分離位於派生類與基類) ;
(2)函數名字雷同;
(3)前往值可以分歧;
(4)參數分歧。此時,豈論有沒有 virtual 症結字,基類的函數將被隱蔽(留意別與重載和籠罩混雜) 。
(5)參數雷同,然則基類函數沒有 virtual症結字。此時,基類的函數被隱蔽(留意別與籠罩混雜) 。
#include <iostream> #include <complex> using namespace std; class Base { public: virtual void a(int x) { cout << "Base::a(int)" << endl; } // overload the Base::a(int) function virtual void a(double x) { cout << "Base::a(double)" << endl; } virtual void b(int x) { cout << "Base::b(int)" << endl; } void c(int x) { cout << "Base::c(int)" << endl; } }; class Derived : public Base { public: // redefine the Base::a() function void a(complex<double> x) { cout << "Derived::a(complex)" << endl; } // override the Base::b(int) function void b(int x) { cout << "Derived::b(int)" << endl; } // redefine the Base::c() function void c(int x) { cout << "Derived::c(int)" << endl; } }; int main() { Base b; Derived d; Base* pb = new Derived; // ----------------------------------- // b.a(1.0); // Base::a(double) d.a(1.0); // Derived::a(complex) pb->a(1.0); // Base::a(double), This is redefine the Base::a() function // pb->a(complex<double>(1.0, 2.0)); // clear the annotation and have a try // ----------------------------------- // b.b(10); // Base::b(int) d.b(10); // Derived::b(int) pb->b(10); // Derived::b(int), This is the virtual function // ----------------------------------- // delete pb; return 0; }
經由過程這裡可以看出:
1. Base類中的第二個函數a是對第一個的重載
2. Derived類中的函數b是對Base類中函數b的重寫,即便用了虛函數特征。
3. Derived類中的函數a是對Base淚中函數a的隱蔽,即重界說了。
4.pb指針是一個指向Base類型的指針,然則它現實指向了一個Derived的空間,這裡對pd挪用函數的處置(多態性)取決因而否重寫 (虛函數特征)了函數,若沒有,則仍然挪用基類。
5. 只要在經由過程基類指針或基類援用 直接指向派生類類型時多態性才會起感化。
6. 由於Base類的函數c沒有界說為virtual虛函數,所以Derived類的函數c是對Base::c()的重界說。
以上這篇淺談C++重載、重寫、重界說就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。