虛函式與純虛函式

2021-07-31 20:20:35 字數 1214 閱讀 6619

在c++中虛函式是實現多型的一種機制,核心理念就是通過基類訪問派生類定義的函式。

最常見的例子就是如下

class a

};class b :public a

};int main(void)

這裡函式foo通過關鍵字virtual宣告為了虛函式,主函式中定義了乙個父類a的指標a,指向乙個子類b,此時再用a去呼叫foo函式,呼叫的則是子類b中的foo函式。如果沒有virtual關鍵字,那麼上述過程中的foo函式就會呼叫a類中的建構函式。

乙個類函式的呼叫並不是在編譯時刻被確定的,而是在執行時刻被確定的這就叫做動態編聯。由於編寫**的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以被稱為「虛」函式。

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」。

含有純虛函式的類被稱為抽象類,不能從抽象類中例項化物件出來。那麼抽象類的作用是什麼呢?

當我們以動物做乙個基類,從這個基類中可以派生出老虎,獅子等動物,但是從動物基類中抽象出乙個例項出來顯然是不合理的。為了處理這類問題,便引入了純虛函式,這樣使派生類中必須重寫基類中的純虛函式,也就繼承了基類的特性。

1.當基類物件要對派生類物件進行操作的時候,析構函式在基類中設定為虛函式,為了防止析構時只析構基類而沒有析構派生類。例如:

class a

~a()

private:

char * ptra_;

};class b: public a

~b()

private:

char * ptrb_;

};void foo()

在這個例子中,程式也許不會象你想象的那樣執行,在執行delete a的時候,實際上只有a::~a()被呼叫了,而b類的析構函式並沒有被呼叫!這是否有點兒可怕?

如果將上面a::~a()改為virtual,就可以保證b::~b()也在delete a的時候被呼叫了。因此基類的析構函式都必須是virtual的。

2.建構函式任何情況下都不能設定為虛函式。因為虛函式的呼叫要在類的虛函式表中查詢。而虛函式表是在建構函式中生成(準確來說是在初始化列表之前,所以建構函式中可以呼叫虛函式),如果建構函式為虛,就需要通過 虛函式表來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到虛函式表,所以建構函式不能是虛函式。

虛函式與純虛函式

1 基本形式 virtual returntype function 1 虛函式宣告 virtual returntype function 2 0 純虛函式宣告 先講示例吧,再總結結論。2 示例 classanimail 這段 的輸出結果是什麼呢?起初我認為是 animail function 1...

虛函式與純虛函式

參考 虛函式 比如 virtual void function1 virtual關鍵字修飾的 成員函式 就是虛函式。把基類的成員函式 設為virtual,其 派生類的相應的函式也會自動變為虛函式。指向 基類的指標在操作它的 多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。純虛...

虛函式與純虛函式

1 基本形式 virtual returntype function 1 虛函式宣告 virtual returntype function 2 0 純虛函式宣告 先講示例吧,再總結結論。2 示例 classanimail 這段 的輸出結果是什麼呢?起初我認為是 animail function 1...