一、virtual修飾基類中的函式,派生類重寫該函式:
#include
using namespace std;
class a
1)這段**的執行結果為:
person構造
teacher構造
student構造
ts構造
ts析構
student析構
teacher析構
person析構
2)但是當我們把person類中析構前面的virtual去掉之後的執行結果為:
person構造
teacher構造
student構造
ts構造
person析構
程式崩潰
很明顯這個結果不是我們想要的程式,崩潰造成的後果是不可預計的,所以我們一定要注意在基類的析構函式前面加上virtual,
使其變成虛析構在c++程式中使用虛函式,虛繼承和虛析構是很好的習慣可以避免許多的問題。
虛析構:
如果乙個類用作基類,我們通常需要virtual來修飾它的析構函式,這點很重要。
如果基類的析構函式不是虛析構,當我們用delete來釋放基類指標(它其實指向的是派生類的物件例項)占用的記憶體的時候,只有基類的析構函式被呼叫,而派生類的析構函式不會被呼叫,
這就可能引起記憶體洩露。如果基類的析構函式是虛析構,那麼在delete基類指標時,繼承樹上的析構函式會被自低向上依次呼叫,即最底層派生類的析構函式會被首先呼叫,
然後一層一層向上直到該指標宣告的型別。
虛繼承:
虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。【菱形繼承】
如:類d繼承自類b1、b2,而類b1、b2都繼承自類a,因此在類d中兩次出現類a中的變數和函式。
為了節省記憶體空間,可以將b1、b2對a的繼承定義為虛擬繼承,而a就成了虛擬基類。實現的**如下:
class a
class b1:public virtual a;
class b2:public virtual a;
class d:public b1,public b2;
虛擬繼承在一般的應用中很少用到,所以也往往被忽視,這也主要是因為在c++中,多重繼承是不推薦的,也並不常用,
而一旦離開了多重繼承,虛擬繼承就完全失去了存在的必要因為這樣只會降低效率和占用更多的空間。
參考鏈結:
C 中virtual(虛函式)的用法
在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。因為它充分體現了物件導向思想中的繼承和多型性這兩大特性,在c 語言裡應用極廣。比如在微軟的mfc類庫中,你會發現很多函式都有virtual關鍵字,也就是說,它們都是虛函式。難怪有人甚至稱虛函式是c 語言的精髓。那...
C 中virtual(虛函式)的用法 詳解
在物件導向的c 語言中,虛函式 virtual function 是乙個非常重要的概念。虛函式是指乙個類中你希望過載的成員函式 當你用乙個 基類指標或引用 指向乙個繼承類物件的時候,呼叫乙個虛函式時,實際呼叫的是繼承類的版本。摘自msdn 舉例 include using namespace std...
virtual虛函式的用法
根據虛函式的不同位置,有著不同的作用。大致分為3類 虛擬繼承,虛函式,純虛函式 1 虛擬繼承 class a class b virtual public a class c virtual public a class d public c,public b int main int argc,c...