哪些函數可以成爲虛函數,哪些函數不可以成爲虛函數

一,什麼是虛函數

擁有 Virtual 關鍵字的函數稱之爲虛函數

虛函數的作用是實現動態綁定的,也就是說程序在運行的時候動態的的選擇合適的成員函數

那麼,有哪些函數可以成爲虛函數?那些函數不可以成爲虛函數?

要成爲虛函數必須滿足兩點,一就是這個函數依賴於對象調用,因爲虛函數就是依賴於對象調用,因爲虛函數是存在於虛函數表中,有一個虛函數指針指向這個虛表,所以要調用虛函數,必須通過虛函數指針,而虛函數指針是存在於對象中的。二就是這個函數必須可以取地址,因爲我們的虛函數表中存放的是虛函數函數入口地址,如果函數不能尋址,就不能成爲虛函數。

 

二,哪些函數不能成爲虛函數?

1.內聯函數:我們都知道內聯函數只是在函數調用點將其展開,它不能產生函數符號,所以不能往虛表中存放,自然就不能成爲虛函數。

2.靜態函數:定義爲靜態函數的函數,這個函數只和類有關係,它不完全依賴於對象調用,所以也不能成爲虛函數。

3.構造函數:都知道只有當調用了構造函數,這個對象才能產生,如果把構造函數寫成虛函數,這時候我們的對象就沒有辦法生    成。更別說用對象去調用了。所以構造函數不能成爲虛函數。

4.友元函數:友元函數不屬於類的成員函數,不能被繼承。對於沒有繼承特性的函數沒有虛函數的說法。

5.普通函數:普通函數不屬於成員函數,是不能被繼承的。普通函數只能被重載,不能被重寫,因此聲明爲虛函數沒有意義。因爲編譯器會在編譯時綁定函數。

 

三,哪些函數可以成爲虛函數呢?

1.普通的成員方法是可以成爲虛函數的

2.還有析構函數,因爲析構函數是爲了釋放對象的,所以之前我們的對象已經生成,而且析構函數可以取地址,所以可以成爲虛函數。

 

四,什麼情況下,析構函數必須定義爲虛函數。

當我們定義了一個基類指針,然後在堆上new了一個派生類的對象,讓這個指針指向堆上開闢的這塊內存。

Base *p = new Derive(10);
delete p;

如果基類的析構函數沒有寫成虛函數,delete這個基類指針,就不能釋放掉堆上的派生類對象。因爲delete p會調用基類的析構,你覺得調用基類的析構函數會釋放掉派生類的對象嗎?當然是不可能的。所以我們就要把基類的析構函數寫成虛函數。寫成虛函數後,當delete的時候,先會去基類調用析構函數,一看基類的析構函數是虛函數,就會自動的到派生類中調用派生類的析構函數。這時候派生類的對象就能釋放了。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章