欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年06月08日 15:41:18   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談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調用函數的處理(多態(tài)性)取決于是否重寫 (虛函數特性)了函數,若沒有,則依然調用基類。

5. 只有在通過基類指針或基類引用 間接指向派生類類型時多態(tài)性才會起作用。

6. 因為Base類的函數c沒有定義為virtual虛函數,所以Derived類的函數c是對Base::c()的重定義。

以上這篇淺談C++重載、重寫、重定義就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++ 的類型轉換詳解

    C++ 的類型轉換詳解

    本篇文章是對C++ 類型轉換的詳細介紹,需要的朋友參考下,小編覺得這篇文章寫的不錯,希望能夠給你帶來幫助
    2021-11-11
  • C語言 野指針與空指針專篇解讀

    C語言 野指針與空指針專篇解讀

    全網最接地氣的C語言野指針介紹,此處對于野指針與空指針知識點做一些簡要的介紹,作者實屬初學,寫博客也是作者學習的一個過程,難免文章中有內容理解不到位或者有不當之處,還請朋友們不吝指正,希望大家多多給予支持,贈人玫瑰,手有余香
    2021-11-11
  • C++編譯原理之求解First集合

    C++編譯原理之求解First集合

    這篇文章主要介紹的是C++/編譯原理求解First集合,本文將圍繞該話題詳細展開全文,需要的小伙伴可以參考一下
    2021-10-10
  • Qt中const?QString轉換?char?*可能的坑

    Qt中const?QString轉換?char?*可能的坑

    本文主要介紹了Qt中const?QString轉換?char?*可能的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • opencv3機器學習之EM算法示例詳解

    opencv3機器學習之EM算法示例詳解

    這篇文章主要介紹了opencv3機器學習之EM算法的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • C++鏈表實現通訊錄管理系統(tǒng)

    C++鏈表實現通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++鏈表實現通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++?多繼承詳情介紹

    C++?多繼承詳情介紹

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個類同時繼承多個類。只有C++等少數語言支持多繼承,下面我們就來看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03
  • C++ 指向類成員的指針

    C++ 指向類成員的指針

    指向類成員的指針總的來講可以分為兩大類四小類(指向數據成員還是成員函數,指向普通成員還是靜態(tài)成員)
    2020-03-03
  • C++解析特殊符號tab和換行符號詳情

    C++解析特殊符號tab和換行符號詳情

    這篇文章主要給大家介紹的是C++解析一些特殊符號tab、換行符號的一些相關資料,需要的小伙伴可以參考下面文章的具體內容
    2021-09-09
  • 純C語言:折半查找源碼分享

    純C語言:折半查找源碼分享

    這篇文章主要介紹了純C語言:折半查找源碼,有需要的朋友可以參考一下
    2014-01-01

最新評論