今天,我們將會在這篇文章中為大家詳細介紹一下C++虛析構函數的一些基本知識。相信對於剛剛接觸C++編程語言的初學者們現在急需要諸如這方面的基礎知識的講解內容,以加大自己對這一語言的認知。
C++的多態性是通過虛函數來實現的,虛函數的出現使得動態鏈接成為可能。
基於構造函數的特點,不能將構造函數定義為虛函數,但可以將析構函數定義為虛函數。當派生類的對象從內存中撤銷時,會先調用派生類的析構函數,然後自動調用基類的析構函數,如此看來析構函數也沒有必要定義為虛函數。
但是考慮如下這種情況,如果使用基類指針指向派生類的對象,而這個派生類對象恰好是用new運算創建的,這種情況下會如何呢?當程序使用delete運算撤銷派生類對象時,這時只會調用基類的析構函數,而沒有調用派生類的析構函數。如果使用的是虛析構函數的話,就不一樣了,所以定義虛析構函數有時候還是很有必要的。下面這段程序就說明了上面的問題:
沒有定義虛C++虛析構函數時,code如下:
- #include < iostream>
- using namespace std;
- class A
- {
- public:
- A(){}
- ~A()
- {
- cout< < "A::destructor"< < endl;
- }
- };
- class B:public A
- {
- public:
- B(){}
- ~B()
- {
- cout< < "B::destructor"< < endl;
- }
- };
- int main()
- {
- A *pA = new B;
- //
- delete pA;
- return 0;
- }
輸出的是A::destructor
這說明delete pA只是調用了基類A的析構函數,而沒有調用子類B的析構函數,這不是我們所想要的。而把基類A的析構函數定義為虛函數後,就可以達到了我們所想要的效果了。code如下:
- #include < iostream>
- using namespace std;
- class A
- {
- public:
- A(){}
- virtual ~A()
- {
- cout< < "A::destructor"< < endl;
- }
- };
- class B:public A
- {
- public:
- B(){}
- ~B()
- {
- cout< < "B::destructor"< < endl;
- }
- };
- int main()
- {
- A *pA = new B;
- //
- delete pA;
- return 0;
- }
輸出如下:
B::destrutor
A::destrutor
以上就是對C++虛析構函數的相關介紹。