沒有指定虛函數, 那么它就只能訪問到類型對應的函數
基類指針就只能訪問到基類函數
子類指針就只能訪問到子類函數
要使用基類訪問到子類的函數, 最符合常規的, 就是虛函數了.
當然, 你也可以使用非常規的, 比如強制轉換, 比如自己計算函數地址並調用.
正常情況,子類祖先類的析構函數都是虛擬的,這樣刪除祖先類指針、子類對象的時候,可正確同時調用子類和祖先類的析構函數):
看一下幾個結論:
1,如果以一個基礎類指針指向一個衍生類對象(派生類對象),那么經由該指針只能訪問基礎類定義的函數(“實函數”暫且這么叫)(靜態聯翩)
2,如果以一個衍生類指針指向一個基礎類對象,必須先做強制轉型動作(explicit cast),這種做法很危險,也不符合生活習慣,在程序設計上也會給程序員帶來困擾。(一般不會這么去定義)
3,如果基礎類和衍生類定義了相同名稱的成員函數,那么通過對象指針調用成員函數時,到底調用那個函數要根據指針的原型來確定,而不是根據指針實際指向的對象類型確定。
虛擬函數就是為了對“如果你以一個基礎類指針指向一個衍生類對象,那么通過該指針,你只能訪問基礎類定義的成員函數”這條規則反其道而行之的設計。
如果你預期衍生類由可能重新定義一個成員函數,那么你就把它定義成虛擬函數( virtual )。
polymorphism就是讓處理基礎類別對象的程序代碼能夠通透的繼續適當地處理衍生類對象。
純虛擬函數:
virtual void myfunc ( ) =0;
純虛擬函數不許定義其具體動作,它的存在只是為了在衍生類鍾被重新定義。只要是擁有純虛擬函數的類,就是抽象類,它們是不能夠被實例化的(只能被繼承)。如果一個繼承類沒有改寫父類中的純虛函數,那么他也是抽象類,也不能被實例化。
抽象類不能被實例化,不過我們可以擁有指向抽象類的指針,以便於操縱各個衍生類。
虛擬函數衍生下去仍然是虛擬函數,而且還可以省略掉關鍵字“virtual”。