程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++虛析構函數基本內容概述

C++虛析構函數基本內容概述

編輯:C++入門知識

今天,我們將會在這篇文章中為大家詳細介紹一下C++虛析構函數的一些基本知識。相信對於剛剛接觸C++編程語言的初學者們現在急需要諸如這方面的基礎知識的講解內容,以加大自己對這一語言的認知。

  • C++基本函數代碼示例
  • C++操作符重載不同方式區別
  • C++文件流應用方法詳細介紹
  • C++聲明語法方法解讀
  • C++ kdevelop基本概念解析

C++的多態性是通過虛函數來實現的,虛函數的出現使得動態鏈接成為可能。

基於構造函數的特點,不能將構造函數定義為虛函數,但可以將析構函數定義為虛函數。當派生類的對象從內存中撤銷時,會先調用派生類的析構函數,然後自動調用基類的析構函數,如此看來析構函數也沒有必要定義為虛函數。

但是考慮如下這種情況,如果使用基類指針指向派生類的對象,而這個派生類對象恰好是用new運算創建的,這種情況下會如何呢?當程序使用delete運算撤銷派生類對象時,這時只會調用基類的析構函數,而沒有調用派生類的析構函數。如果使用的是虛析構函數的話,就不一樣了,所以定義虛析構函數有時候還是很有必要的。下面這段程序就說明了上面的問題:

沒有定義虛C++虛析構函數時,code如下:

  1. #include < iostream> 
  2. using namespace std;  
  3. class A  
  4. {  
  5. public:  
  6. A(){}  
  7. ~A()  
  8. {  
  9. cout< < "A::destructor"< < endl;  
  10. }  
  11. };  
  12. class B:public A   
  13. {  
  14. public:  
  15. B(){}  
  16. ~B()  
  17. {  
  18. cout< < "B::destructor"< < endl;  
  19. }  
  20. };  
  21. int main()  
  22. {  
  23. A *pA = new B;  
  24. //  
  25. delete pA;  
  26. return 0;  

輸出的是A::destructor

這說明delete pA只是調用了基類A的析構函數,而沒有調用子類B的析構函數,這不是我們所想要的。而把基類A的析構函數定義為虛函數後,就可以達到了我們所想要的效果了。code如下:

  1. #include < iostream> 
  2. using namespace std;  
  3. class A  
  4. {  
  5. public:  
  6. A(){}  
  7. virtual ~A()  
  8. {  
  9. cout< < "A::destructor"< < endl;  
  10. }  
  11. };  
  12. class B:public A   
  13. {  
  14. public:  
  15. B(){}  
  16. ~B()  
  17. {  
  18. cout< < "B::destructor"< < endl;  
  19. }  
  20. };  
  21. int main()  
  22. {  
  23. A *pA = new B;  
  24. //  
  25. delete pA;  
  26. return 0;  

輸出如下:

B::destrutor

A::destrutor

以上就是對C++虛析構函數的相關介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved