基類指針指向派生類對象&派生類指針指向基類對象


靜態綁定

  1. 如果以一個基礎類指針指向一個衍生類對象(派生類對象),那么經由該指針只能訪問基礎類定義的函數
  2. 如果以一個衍生類指針指向一個基礎類對象,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程序設計上也會給程序員帶來困擾。
  3. 如果基礎類和衍生類定義了相同名稱的成員函數,那么通過對象指針調用成員函數時,到底調用那個函數要根據指針的原型來確定,而不是根據指針實際指向的對象類型確定。

虛函數

  1. 通過對象指針調用成員函數時,根據指針實際指向的對象類型確定。
  2. 在構造函數中調用(純)虛函數,不會有虛函數的效應,只會調用父類本身的那個函數定義體,如果父類沒有給出函數定義,就會鏈接出錯,
    但也卻實是因為對象的構造順序決定了不能調用子類的函數體(父類在構造的時候,子類還沒有構造呢,當然不會有虛函數效果)。

純虛函數

  1. virtual void func ( ) = 0;
    純虛擬函數不許定義其具體動作,它的存在只是為了在衍生類鍾被重新定義。只要是擁有純虛擬函數的類,就是抽象類,它們是不能夠被實例化的(只能被繼承)。如果一個繼承類沒有改寫父類中的純虛函數,那么他也是抽象類,也不能被實例化。
  2. 抽象類不能被實例化,不過我們可以擁有指向抽象類的指針,以便於操縱各個衍生類。
  3. 虛擬函數衍生下去仍然是虛擬函數,而且還可以省略掉關鍵字“virtual”。

抽象類

帶有純虛函數的類稱為抽象類。

構造函數

  1. 在構造函數中調用虛函數,調用的是自己類的虛函數,如果調用純虛函數,由於沒有定義,會報錯。

析構函數

  1. 通過子類對象的指針刪除子類對象時,無論父類的析構函數是不是虛的,都會調用父類的析構函數。但是通過父類對象的指針(指向子類對象)刪除對象時,如果父類的析構函數不是虛的,那么就不會調用子類的析構函數。所以為了保證正確性,要將會被派生的類的析構函數聲明為虛的。

虛函數與默認參數

  1. 虛函數重載時,子類修改了父類的缺省的參數值 ,那么將根據指針本身的類型來決定缺省參數的值,但是調的函數還是有虛函數作用的,即對象實際是什么類型將調用它所對應的函數。
    用一句話來解釋原因就是:虛函數是動態綁定的(dynamically bound),但是缺省參數卻是靜態綁定的(statically bound)。

const

  1. 函數加上const修飾與不加const,實際上聲明了兩個不同的函數。所以在父類中加上const,但是子類同名同參的函數沒有加const,他們是兩個不同的接口,此時虛函數沒有被重載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM