C/C++筆記 -- C++ 多態

1、函數的重載
      函數重載依據參數列表的不同來區分,而與返回值無關。全局函數和類成員函數同名同參不算重載,其作用域不一樣。
2、成員函數的重載(overload),覆蓋(overrid)和隱藏
       成員函數的重載是:具有相同的作用域,函數名字相同,參數類型(包括const或非const),順序或數目不同,virtual關鍵字忽略。
      覆蓋是指派生類重新定義了基類的成員函數,其特徵是:作用域,函數名,參數都相同,且基類函數必須是虛函數。
     隱藏是一種派生類的同名函數不能重新實現基類的同名函數的現象(與多態覆蓋相反),隱藏會體現在如下:
     a.派生類的同名函數與參數列表與基類不一樣,不管基類的函數是否virtual都將被隱藏。
     b.派生類與基類的同名函數的參數列表也一樣,但基類函數不是virtual類型的。
    擺脫隱藏的兩種辦法:
    1、針對a.,把隱藏的函數變爲“重載”,子類中使用using Base:fun來顯示聲明,類似聲明瞭一個同名,同參的一個子類函數。
    2、針對b,把在子類的同名同參函數中顯示的調用傳遞,Base::fun.

3、異常處理
      異常處理機制是一種運行時通知機制。異常拋出點與異常撲點一般距離很遠,異常拋出點可能在底層軟件模塊內,而異常捕獲點
     在高層主件中。拋出的異常對象可以是任何類型。catch子句像帶一個參數的函數,而throw相當於函數的調用語句,不過catch子句處理完了後,不會回到throw而是繼續catch後的語句繼續執行。異常未被捕獲,throw到頂層後會被調用unexpected()函數而終止(terminate())通過調用set_unexpected來重設終止功能函數。
    所有從try到throw之間構造起來的局部對象的析構函數將按以構造函數相反的順序自動析構。
    由於構造函數和析構函數沒有返回值,所以對於需要捕獲構造或析構出錯信息,最合適的方式就是拋出異常。
    catch塊的參數應當採用引用傳遞而不是值傳遞、一定把派生類的異常匹配放到基類前,否則容易出現被過早處理掉了。
     可以在catch塊中拋出一個與當前異常類型不同的異常對象(常用於異常說明與實際拋出的異常不符的時候)。
     異常說明是用來修飾可能拋出異常的函數的,用來限制該函數所拋出異常的種類。
     void g()throw(); //不拋出異常;
     void f()//可能拋出異常;
     void k()throw T1,T2//可能拋出2種異常
     異常說明的好處除了限制函數拋出的異常種類,更爲客戶代碼(調用者)提供捕獲異常的說明。
4,RTTI
        虛函數可以動態的根據指針或引用指向的對象來執行對應派生類的函數,但對於派生類新括的函數(基類沒有的),無法通過基類的指針或引用來顯示的調用。typid()返回描述當前對象類型信息type_info。type_info支持/重載了==,!=運算符括了name()函數。調用typeid的開銷和
      調用虛函數是一樣的,但調用dynamic_cast<dest_type>運算符需要遍歷一顆繼承樹。static_cast<dest_type>的區別在於static_cast<dest_type>只是做編譯時類型強制轉換。
發佈了34 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章