C 中虛析構函式

2021-06-29 13:34:59 字數 1755 閱讀 5252

析構函式是為了在物件不被使用之後釋放它的資源,虛函式是為了實現多型。那麼把析構函式宣告為vitual有什麼作用呢?請看下面的**:

1       #include

2       using namespace std; 3

4       class base

5       ;      

8           ~base()       

9           ;

12          virtual void dosomething() 

13          ;

16     };

17    

18     class derived : public base

19     ;    

22              ~derived()     

23              ;

26              void dosomething()

27              ;

30     };

31    

32     int main()

33    

先看程式輸出結果:

1       do something in class derived!

2       output from the destructor of class derived!

3       output from the destructor of class base!

4      

5       do something in class derived!

6       output from the destructor of class base!

**第36行可以正常釋放ptest1的資源,而**第42行沒有正常釋放ptest2的資源,因為從結果看derived類的析構函式並沒有被呼叫。通常情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話就會造成記憶體洩漏。原因是指標ptest2是base型別的指標,釋放ptest2時只進行base類的析構函式。在**第8行前面加上virtual關鍵字後的執行結果如下:

1       do something in class derived!

2       output from the destructor of class derived!

3       output from the destructor of class base!

4      

5       do something in class derived!

6       output from the destructor of class derived!

7       output from the destructor of class base!

此時釋放指標ptest2時,由於base的析構函式是virtual的,就會先找到並執行derived類的析構函式,然後再執行base類的析構函式,資源正常釋放,避免了記憶體洩漏。

因此,只有當乙個類被用來作為基類的時候,才會把析構函式寫成虛函式。

多型性是在父類或各子類中執行最合適成員函式。一般來說,只會選擇父類或子類中的某乙個成員函式來執行。這可給析構函式帶來了麻煩!

如果有的資源是父類的建構函式申請的,有的資源是子類的建構函式申請的,而虛函式只允許程式執行父類或子類中的某乙個析構函式,豈不是注定有一部分資源將無法被釋放?為了解決這個問題,虛析構函式變得與眾不同。

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...