亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

談C++繼承中的重載、覆蓋和隱藏

2019-11-17 05:18:59
字體:
來源:轉載
供稿:網友

  寫正題之前,先給出幾個要害字的中英文對照,重載(overload),覆蓋(override),隱藏(hide)。在早期的C++書籍中,可能翻譯的人不熟悉專業用語(也不能怪他們,他們不是搞計算機編程的,他們是英語專業的),經常把重載(overload)和覆蓋(override)搞錯!

  我們先來看一些代碼及其編譯結果。

  實例一:    

    #include "stdafx.h"
    #include
  class CB
    {
    public:
       void f(int)

       {
          cout << "CB::f(int)" << endl;
       }
  };  

  class CD : public CB
    {
    public:
       void f(int,int)
       {
         cout << "CD::f(int,int)" << endl;
       }
       void test()
       {
        f(1);
       }
    }; 

   int main(int argc, char* argv[])
   {
      return 0;
   }
  編譯了一下
  error C2660: 'f' : function does not take 1 parameters

  結論:在類CD這個域中,沒有f(int)這樣的函數,基類中的void f(int)被隱藏

  假如把派生CD中成員函數void f(int,int)的聲明改成和基類中一樣,即f(int),基類中的void f(int)還是一樣被覆蓋,此時編譯不會出錯,在函數中test調用的是CD中的f(int) 

  所以,在基類中的某些函數,假如沒有virtral要害字,函數名是f(參數是什么我們不管),那么假如在派生類CD中也聲明了某個f成員函數,那么在類CD域中,基類中所有的那些f都被隱藏。

  假如你比較心急,想知道什么是隱藏,看文章最后的簡單說明,不過我建議你還是一步一步看下去。

  我們剛才說的是沒有virtual的情況,假如有virtual的情況呢??

  實例二:  

  #include "stdafx.h"
  #include  
  class CB
  {
  public:
     virtual void f(int)
     {
       cout << "CB::f(int)" << endl;
     }  

  };  

  class CD : public CB
  {
  public:
     void f(int)
     {
       cout << "CD::f(int)" << endl;
     }  

  };  
  int main(int argc, char* argv[])
  {
    return 0;
  }
  這么寫當然是沒問題了,在這里我不多費口舌了,這是很簡單的,多態,虛函數,然后什么指向基類的指針指向派生類對象阿,通過引用調用虛函數阿什么的,屬性多的很咯,什么??你不明白??隨便找本C++的書,對會講多態和虛函數機制的哦?。?div class="mq6aw8s" id="article"> QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題

  這種情況我們叫覆蓋(override)!覆蓋指的是派生類的虛擬函數覆蓋了基類的同名且參數相同的函數!

  在這里,我要強調的是,這種覆蓋,要滿足兩個條件

  (a)有virtual要害字,在基類中函數聲明的時候加上就可以了

  (b)基類CB中的函數和派生類CD中的函數要一模一樣,什么叫一模一樣,函數名,參數,返回類型三個條件。

  有人可能會對(b)中的說法質疑,說返回類型也要一樣??


  是,覆蓋的話必須一樣,我試了試,假如在基類中,把f的聲明改成virtual int f(int),編譯出錯了
  error C2555: 'CD::f' : overriding virtual function differs from 'CB::f' only by return type or calling convention

  所以,覆蓋的話,必須要滿足上述的(a)(b)條件

  那么假如基類CB中的函數f有要害字virtual ,但是參數和派生類CD中的函數f參數不一樣呢,

  實例三:

   #include "stdafx.h"
  #include   
  class CB
  {
   public:
      virtual void f(int)
     {
        cout << "CB::f(int)" << endl;
     }  

  }
  ;  

  class CD : public CB
  {
  public:
      void f(int,int)
     {
       cout << "CD::f(int,int)" << endl;
     } 
     void test()
     {
        f(1);
     }
  }
  ; 

  int main(int argc, char* argv[])
  {
   return 0;
  }  

  編譯出錯了,

  error C2660: 'f' : function does not take 1 parameters

  咦??好面熟的錯??對,和實例一中的情況一樣哦,結論也是基類中的函數被隱藏了。

  通過上面三個例子,得出一個簡單的結論

  假如基類中的函數和派生類中的兩個名字一樣的函數f

  滿足下面的兩個條件

  (a)在基類中函數聲明的時候有virtual要害字

  (b)基類CB中的函數和派生類CD中的函數一模一樣,函數名,參數,返回類型都一樣。

  那么這就是叫做覆蓋(override),這也就是虛函數,多態的性質

  那么其他的情況呢??只要名字一樣,不滿足上面覆蓋的條件,就是隱藏了?! ?br />
  下面我要講最要害的地方了,好多人認為,基類CB中的f(int)會繼續下來和CD中的f(int,int)在派生類CD中構成重載,就像實例一中想像的那樣。

  對嗎?我們先看重載的定義

  重載(overload):

  必須在一個域中,函數名稱相同但是函數參數不同,重載的作用就是同一個函數有不同的行為,因此不是在一個域中的函數是無法構成重載的,這個是重載的重要特征

  必須在一個域中,而繼續明顯是在兩個類中了哦,所以上面的想法是不成立的,我們測試的結構也是這樣,派生類中的f(int,int)把基類中的f(int)隱藏了

  所以,相同的函數名的函數,在基類和派生類中的關系只能是覆蓋或者隱藏。

  在文章中,我把重載和覆蓋的定義都給了出來了,但是一直沒有給隱藏的定義,在最后,我把他給出來,這段話是網上Google來的,比較長,你可以簡單的理解成,在派生類域中,看不到基類中的那個同名函數了,或者說,是并沒有繼續下來給你用,呵呵,如實例一那樣。  

  隱藏(hide):

  指的是派生類的成員函數隱藏了基類函數的成員函數.隱藏一詞可以這么理解:在調用一個類的成員函數的時候,編譯器會沿著類的繼續鏈逐級的向上查找函數的定義,假如找到了那么就停止查找了,所以假如一個派生類和一個基類都有同一個同名(暫且不論參數是否相同)的函數,而編譯器最終選擇了在派生類中的函數,那么我們就說這個派生類的成員函數"隱藏"了基類的成員函數,也就是說它阻止了編譯器繼續向上查找函數的定義

上一篇:C語言基礎教程(一)基礎篇

下一篇:new和delete導致的內存分配問題詳解

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品优优av| 国产精品爽爽ⅴa在线观看| 91产国在线观看动作片喷水| 国产精品久久久久久久av电影| 国产亚洲欧洲黄色| 精品久久久久久中文字幕| zzijzzij亚洲日本成熟少妇| 欧美激情一级二级| 日本久久久久亚洲中字幕| 欧美性jizz18性欧美| 亚洲精品ady| 国产97在线播放| 韩国福利视频一区| 日韩精品在线免费| 亚洲人在线视频| 欧美日韩一区二区三区在线免费观看| 精品亚洲一区二区三区| 国产精品一香蕉国产线看观看| 在线观看欧美www| 久久久噜噜噜久久中文字免| 亚洲精品v天堂中文字幕| 久久久久久亚洲精品中文字幕| 欧美激情精品在线| 国产精品亚洲网站| 久久久亚洲网站| 欧美成人午夜激情| 亚洲电影中文字幕| 欧美性xxxx极品hd欧美风情| 国产午夜精品免费一区二区三区| 欧美电影免费播放| 最近2019年中文视频免费在线观看| 亚洲欧洲视频在线| 国产在线播放不卡| 精品亚洲男同gayvideo网站| 中文字幕视频在线免费欧美日韩综合在线看| 久久视频在线视频| 91精品久久久久久久久久另类| 精品中文字幕乱| 中文字幕日韩欧美精品在线观看| 亚洲欧美激情视频| 欧洲成人性视频| 国产999在线观看| 不卡av电影在线观看| 欧美性猛交xxxx免费看| 在线观看免费高清视频97| 136fldh精品导航福利| 亚洲一区二区在线播放| 亚洲人成欧美中文字幕| 日韩一级裸体免费视频| 欧美香蕉大胸在线视频观看| 国产精品久久久久久久久久久不卡| 91香蕉嫩草影院入口| 中文字幕亚洲一区在线观看| 最新日韩中文字幕| 在线视频欧美日韩| 久久婷婷国产麻豆91天堂| 伊人久久大香线蕉av一区二区| 欧美午夜性色大片在线观看| 欧美成年人网站| 4444欧美成人kkkk| 国产精品久久久久9999| 亚洲一区二区国产| 欧美另类暴力丝袜| 少妇高潮久久77777| 精品国产91久久久久久| 91a在线视频| 久久成人精品一区二区三区| 成人在线观看视频网站| 中文字幕欧美日韩精品| 亚洲成av人乱码色午夜| 国产一区二区三区丝袜| 欧美午夜片欧美片在线观看| 亚洲丁香婷深爱综合| 国产亚洲欧洲高清| 久青草国产97香蕉在线视频| 日韩精品电影网| 欧美成人亚洲成人日韩成人| 日韩av一区二区在线| 欧美黄网免费在线观看| 国产精彩精品视频| 国产成人综合精品在线| 亚洲少妇激情视频| 亚洲第一天堂av| 亚洲丝袜av一区| 日本精品久久久久久久| 久久久久久免费精品| 国产成人小视频在线观看| 亚洲国产精品久久久久秋霞蜜臀| 国产精品自产拍在线观| 欧美一级在线亚洲天堂| 亚洲日本中文字幕免费在线不卡| 成人免费直播live| 九九精品视频在线| 国产啪精品视频| 欧美日韩激情网| 91av网站在线播放| 亚洲精品成人av| 91精品视频在线免费观看| 美女av一区二区三区| 3344国产精品免费看| 91在线精品视频| 97精品久久久中文字幕免费| 久久天天躁夜夜躁狠狠躁2022| 8x海外华人永久免费日韩内陆视频| 欧美成人午夜激情在线| 国产精品扒开腿做爽爽爽的视频| 日本国产精品视频| 亚洲人成电影网站色| 欧美做受高潮1| 美乳少妇欧美精品| 国产做受69高潮| 久久精品亚洲国产| 社区色欧美激情 | 久久天天躁狠狠躁老女人| 久久久久久久97| 国产美女精品视频免费观看| 九九热最新视频//这里只有精品| 国产精品成人久久久久| 亚洲成年网站在线观看| 日韩高清免费在线| 精品福利一区二区| 中文字幕久久精品| 国产亚洲美女精品久久久| 亚洲精品国产精品国自产观看浪潮| 国产欧美精品日韩| 欧美性在线观看| 国产精品视频26uuu| 欧美成人精品在线播放| 久久久久久久97| 亚洲精品中文字幕av| 日韩精品在线观看网站| 国产精品中文久久久久久久| 久久久亚洲福利精品午夜| 国产成人精品一区二区在线| 国产aⅴ夜夜欢一区二区三区| xxxx欧美18另类的高清| 亚洲精品动漫久久久久| 日韩欧美黄色动漫| 成人写真福利网| 亚洲精品黄网在线观看| y97精品国产97久久久久久| 亚洲网站在线看| 97视频在线观看视频免费视频| 欧美激情aaaa| 国产视频欧美视频| 亚洲美女精品成人在线视频| 欧美性黄网官网| 日韩中文字幕精品视频| 国产精品美女网站| 日韩美女毛茸茸| 亚洲精品一区久久久久久| 日韩在线观看免费av| 91社区国产高清| 亚洲伊人久久综合| 日韩视频精品在线| 欧美国产在线电影| 成人综合国产精品| 国产一区二区成人| 国产日韩欧美黄色| 日韩欧美在线国产| 亚洲精品福利在线观看| 91久久精品美女| 亚洲成人免费在线视频| 色先锋资源久久综合5566|