基類的析構函式,必須定義成虛函式,否則,當基類的指標呼叫子類的物件成員時,會造稱析構不徹底,從而造成記憶體洩漏。
虛函式和純虛函式的區別**自這裡 )
虛函式和純虛函式可以定義在同乙個類(class)中,含有純虛函式的類被稱為抽象類(abstract class),而只含有虛函式的類(class)不能被稱為抽象類(abstract class)。
虛函式可以被直接使用,也可以被子類(sub class)過載以後以多型的形式呼叫,而純虛函式必須在子類(sub class)中實現該函式才可以使用,因為純虛函式在基類(base class)只有宣告而沒有定義。
虛函式和純虛函式都可以在子類(sub class)中被過載,以多型的形式被呼叫。
虛函式和純虛函式通常存在於抽象基類(abstract base class -abc)之中,被繼承的子類過載,目的是提供乙個統一的介面。
虛函式的定義形式:virtual
純虛函式的定義形式:virtual = 0;
在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結(run-time bind),而且被兩者修飾的函式生命週期(life recycle)也不一樣。
6 虛函式必須實現,如果不實現,編譯器將報錯,錯誤提示為:
error lnk****: unresolved external symbol "public: virtual void __thiscall
classname::virtualfunctionname(void)"碼片`
對於虛函式來說,父類和子類都有各自的版本。由多型方式呼叫的時候動態繫結。
實現了純虛函式的子類,該純虛函式在子類中就變成了虛函式,子類的子類即孫子類可以覆蓋該虛函式,由多型方式呼叫的時候動態繫結。
虛函式是c++中用於實現多型(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的函式
多型性指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。
a.編譯時多型性:通過過載函式實現
b 執行時多型性:通過虛函式實現。
虛函式的常見問題
1 虛函式是動態繫結的,也就是說,使用虛函式的指標和引用能夠正確找到實際類的對應函式,而不是執行定義類的函式。這是虛函式的基本功能,就不再解釋了。2 建構函式不能是虛函式 而且,在建構函式中呼叫虛函式,實際執行的是父類的對應函式 因為自己還沒有構造好,多型是被disable的。3 析構函式可以是虛函...
C 虛函式問題
1定義乙個函式式虛函式是為了允許 用基類的指標來呼叫子類的的這個函式。比如下面 這個類的函式呼叫不是在編譯的時候被確定,而是執行的時候被確定。include using namespace std class a 2根據網上部落格,簡單理解虛函式以及虛函式表。虛函式是根據虛函式表來實現的,這個表分配...
C 虛函式問題
1.建構函式中可以呼叫虛函式嗎 可以,只是不會產生動態行為,因為建構函式是從基類開始構造,基類在呼叫虛函式時,子類還未構造,所以呼叫的是基類的函式。2.析構函式可以呼叫虛函式嗎 如果在父類析構函式中呼叫虛函式,其實際呼叫的是子類的函式,而此時子類析構函式已經把資料銷毀了,會出現不可知的結果。3.析構...