国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

淺談C++重載、重寫、重定義

2020-05-23 14:03:01
字體:
來源:轉載
供稿:網友
下面小編就為大家帶來一篇淺談C++重載、重寫、重定義。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
 

一、重載(overload)

指函數名相同,但是它的參數表列個數或順序,類型不同。但是不能靠返回類型來判斷。

(1)相同的范圍(在同一個作用域中) ;

(2)函數名字相同;

(3)參數不同;

(4)virtual 關鍵字可有可無。

(5)返回值可以不同;

二、重寫(也稱為覆蓋 override)

是指派生類重新定義基類的虛函數,特征是:

(1)不在同一個作用域(分別位于派生類與基類) ;

(2)函數名字相同;

(3)參數相同;

(4)基類函數必須有 virtual 關鍵字,不能有 static 。

(5)返回值相同(或是協變),否則報錯;<—-協變這個概念我也是第一次才知道…

(6)重寫函數的訪問修飾符可以不同。盡管 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的

三、重定義(也成隱藏)

(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++重載、重寫、重定義就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西充县| 闽侯县| 东源县| 文成县| 利川市| 勃利县| 马龙县| 武夷山市| 无锡市| 潞西市| 鄂伦春自治旗| 佳木斯市| 师宗县| 双牌县| 三穗县| 仙游县| 昌宁县| 泗水县| 平泉县| 邹平县| 探索| 环江| 林芝县| 滨州市| 吉安县| 平乐县| 卢湾区| 贵阳市| 定襄县| 屏南县| 上虞市| 旅游| 读书| 宁波市| 屏东县| 千阳县| 敦化市| 新乐市| 焉耆| 乌鲁木齐市| 南澳县|