虛函式是c++中用於實現多型(polymorphism)的機制。核心理念就是通過基類訪問派生類定義的函式,虛函式只能借助於指標或者引用來達到多型的效果。
虛函式的語法:
1:class a
;class b: public a
;class c: public b // 從b繼承,不是從a繼承!
;這種情況下,b::foo()是虛函式,c::foo()也同樣是虛函式。因此,可以說,基類宣告的虛函式,在派生類中也是虛函式,即使不再使用virtual關鍵字
2:純虛函式:
乙個函式宣告為純虛後,純虛函式的意思是:我是乙個抽象類!不要把我例項化!純虛函式用來規範派生類的行為,實際上就是所謂的「介面」。它告訴使用者,我的派生類都會有這個函式。
3:純虛構函式:
當乙個類打算被用作其它類的基類時,它的析構函式必須是虛的。
4:虛建構函式:
建構函式不能是虛的
5:虛函式使用技巧:
5.1:class a
private:
virtual void bar()
};class b: public a
};在這個例子中,雖然bar()在a類中是private的,但是仍然可以出現在派生類中,並仍然可以與public或者protected的虛函式一樣產生多型的效果。並不會因為它是private的,就發生a::foo()不能訪問b::bar()的情況,也不會發生b::bar()對a::bar()的override不起作用的情況。
這種寫法的語意是:a告訴b,你最好override我的bar()函式,但是你不要管它如何使用,也不要自己呼叫這個函式。
5.2:建構函式和析構函式中的虛函式呼叫
乙個類的虛函式在它自己的建構函式和析構函式中被呼叫的時候,它們就變成普通函式了,不「虛」了。也就是說不能在建構函式和析構函式中讓自己「多型」。例如:
class a
// 在這裡,無論如何都是a::foo()被呼叫!
~a() // 同上
virtual void foo();
};class b: public a
;void bar()
如果你希望delete a的時候,會導致b::foo()被呼叫,那麼你就錯了。同樣,在new b的時候,a的建構函式被呼叫,但是在a的建構函式中,被呼叫的是a::foo()而不是b::foo()。
參考:
C virtual 析構函式
include using std cout using std endl class base class derived public base void main 執行結果 d b 解釋 沿著程式執行流程,從 main 函式進入 首先,執行語句 base b new derived 結果是在堆...
C Virtual 函式 《理論 實踐》
class a 重要的幾個點 1.當乙個成員函式 包括析構函式在內 宣告為虛函式後,其派生類中的同名函式都自動成為虛函式,無論是否加virtual關鍵字。2.用基類的指標或者引用指向派生類物件,通過基類的指標或者引用呼叫虛函式,實際執行的將是派生類物件中定義的虛函式。靜態連線 用虛函式實現動態連線在...
c virtual 虛析構函式 資源釋放的討論
關於c virtual,析構函式的討論已經挺多了,參見 但是我在使用時卻恰恰發生了相反的事情,不是記憶體洩漏,而是記憶體重複刪除。這也是乙個需要深思的問題。我們還是以傳統的animal和dog為例。首先是基類 animal pragma once class animal 實現 include an...