C virtual函式重點

2021-07-27 04:16:41 字數 1183 閱讀 1065

虛函式是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...