中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++中虛函數與虛析構函數有什么用

發布時間:2022-01-14 17:18:11 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

這篇文章主要介紹了c++中虛函數與虛析構函數有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

虛函數與虛析構函數虛函數與虛析構函數

    在類中,有兩個與眾不同的成員函數,那就是構造函數和析構函數。當構造函數與析構函數遭遇繼承和多態,它們的運行狀況又會出現什么變化呢?

    多態性是在父類或各子類中執行最合適成員函數。一般來說,只會選擇父類或子類中的某一個成員函數來執行。這可給析構函數帶來了麻煩!如果有的資源是父類的構造函數申請的,有的資源是子類的構造函數申請的,而虛函數只允許程序執行父類或子類中的某一個析構函數,豈不是注定有一部分資源將無法被釋放?為了解決這個問題,虛析構函數變得與眾不同。

下面我們就來給析構函數的前面加上保留字 virtual,看看運行的結果會怎么樣:

  1. //animal.h

  2. #include <iostream>

  3. using namespace std;


  4. class Animal

  5. {

  6.     public:

  7.         Animal(int w = 0, int a = 0);

  8.         virtual ~Animal();

  9.     protected:

  10.         int weight;

  11.         int age;

  12. };


  13. Animal::Animal(int w, int a)

  14.     :weight(w), age(a)

  15. {

  16.     cout <<"Animal
    consturctor is running..." <<endl;

  17. }

  1. //cat.h

  2. #include "animal.h"


  3. class Cat : public Animal

  4. {

  5.     public:

  6.         Cat(int w = 0, int a = 0);

  7.         ~Cat();

  8. };


  9. Cat::Cat(int w, int a):Animal(w, a)

  10. {

  11.     cout <<"Cat
    constructor is running..." <<endl;

  12. }

  13. Cat::~Cat()

  14. {

  15.        cout <<"Cat
    destructor is running..." <<endl;

  16. }

  1. //main.cpp

  2. #include "cat.h"


  3. int main(void)

  4. {

  5.     Animal *pa=new
    Cat(2,1);

  6.     Cat *pc=new
    Cat(2,4);


  7.     cout <<">>>
    Delete pa <<<" <<endl;

  8.     delete pa;


  9.     cout <<">>>
    Delete pc <<<" <<endl;

  10.     delete pc;


  11.     return 0;

  12. }

運行結果:
Animal consturctor is running...
Cat constructor is running...
Animal consturctor is running...
Cat constructor is running...
>>> Delete pa <<<
Cat destructor is running...
Animal destructor is running...
>>> Delete pc <<<
Cat destructor is running...
Animal destructor is running...

    發現虛析構函數不再是運行父類或子類的某一個析構函數,而是先運行合適的子類析構函數,再運行父類析構函數。即兩個類的析構函數都被執行了,如果兩塊資源分別是由父類構造函數和子類構造函數申請的,那么使用了虛析構函數之后,兩塊資源都能被及時釋放。

我們修改程序,將 Animal 類析構函數前的 virtual 去掉
運行結果:
Animal consturctor is running...
Cat constructor is running...
Animal consturctor is running...
Cat constructor is running...
>>> Delete pa <<<
Animal destructor is running...
>>> Delete pc <<<
Cat destructor is running...
Animal destructor is running...

    發現運行結果中刪除 pa 指向的 Cat 對象時,不執行 Cat 類的析構函數。如果這時 Cat 類的構造函數里申請了內存資源,就會造成內存泄漏了。

所以說,虛函數與虛析構函數的作用是不同的。虛函數是為了實現多態,而虛析構函數是為了同時運行父類和子類的析構函數,使資源得以釋放。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“c++中虛函數與虛析構函數有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

岳阳县| 益阳市| 苗栗市| 环江| 哈尔滨市| 武宁县| 邹平县| 孝义市| 奈曼旗| 巴楚县| 敦化市| 宜君县| 马鞍山市| 长武县| 房产| 进贤县| 苍南县| 仁化县| 绥阳县| 雷山县| 彭州市| 白朗县| 松滋市| 平原县| 镇赉县| 满洲里市| 昌黎县| 抚松县| 桐城市| 潢川县| 海兴县| 岳阳县| 方正县| 黄冈市| 河北省| 天全县| 青田县| 中卫市| 苏尼特左旗| 龙州县| 筠连县|