最近準備複習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。 父類為A,子類為B,代碼如下: 這個時候在main函數里, 定義一個A的對象,A a;運行輸出結果為:構造A 析構A。 定義一個B的對象, B b;運行的輸出結果為:構造B 析構B。 定義一個A的指針,指向B。A *P = ...
最近準備複習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。
父類為A,子類為B,代碼如下:
1 class A 2 { 3 public: 4 A() 5 { 6 cout << "構造A"<< endl; 7 } 8 ~A() 9 { 10 cout << "析構A" << endl; 11 } 12 } 13 class B:public A 14 { 15 public: 16 B() 17 { 18 cout << "構造B"<< endl; 19 } 20 ~B() 21 { 22 cout << "析構B"<< endl; 23 } 24 25 }
這個時候在main函數里,
定義一個A的對象,A a;運行輸出結果為:構造A 析構A。
定義一個B的對象, B b;運行的輸出結果為:構造B 析構B。
定義一個A的指針,指向B。A *P = new b; 運行輸出結果為:構造A 構造B.這個時候很多人就容易出問題了,為啥沒調用析構呢,這個也是經常遇到的問題,最簡單也是最容易遺忘的。new出來的對象沒有刪,還有寫一行代碼 delete p;這個時候的運行輸出結果為:構造A 構造B 析構A。又出現問題了,B的析構怎麼沒走,這個時候需要一用虛析構這個概念,虛析構的功能:父類的析構寫成虛析構,在刪除父類的指針的時候,可以刪除子類的對象,避免記憶體泄漏。
具體操作就是把上面代碼的第八行,前面加一個virtual。這個時候再運行輸出結果為:構造A 構造B 析構B 析構A。註意這裡也可以看出調用順序,先走父類的構造,然後子類的構造。先走子類的析構,最後走父類的析構。