亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ virtual destructor虛擬析構函數(shù)

 更新時間:2021年05月24日 09:24:48   作者:我是小白呀  
C++中基類采用virtual虛析構函數(shù)是為了防止內(nèi)存泄漏。具體地說,如果派生類中申請了內(nèi)存空間,并在其析構函數(shù)中對這些內(nèi)存空間進行釋放,今天通過本文給大家介紹C++ virtual destructor虛擬析構函數(shù)的相關知識,感興趣的朋友一起看看吧

概述

虛析構函數(shù) (virtual destructor) 可以幫我們實現(xiàn)基類指針刪除派生類對象.

在這里插入圖片描述

問題

當我們從派生類的對象從內(nèi)存中撤銷時會先調(diào)用派生的析構函數(shù), 然后再基類的析構函數(shù), 由此就會產(chǎn)生問題:

  • 如果用 new 運算符建立了派生類對象, 并且由一個基類的指針比那里指向該對象
  • 用 delete 運算符撤銷對象時, 系統(tǒng)只執(zhí)行基類的析構函數(shù). 而不執(zhí)行派生類的析構函數(shù), 派生類對象析構中要求的工作將被忽略

Base 類:

#ifndef PROJECT6_BASE_H
#define PROJECT6_BASE_H

#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        cout << "執(zhí)行基類構造函數(shù)" << endl;
    };
    ~Base() {
        cout << "執(zhí)行基類析構函數(shù)" << endl;
    };
};

#endif //PROJECT6_BASE_H

Derived 類:

#ifndef PROJECT6_DERIVED_H
#define PROJECT6_DERIVED_H

#include <iostream>
#include "Base.h"
using namespace std;

class Derived : public Base {
public:
    Derived() {
        cout << "執(zhí)行派生類構造函數(shù)" << endl;
    };
    ~Derived() {
        cout << "執(zhí)行派生類析構函數(shù)" << endl;
    }
};

#endif //PROJECT6_DERIVED_H

main:

#include <iostream>
#include "Derived.h"
using namespace std;

int main() {

    Base *pt =new Derived;
    delete pt;

    return 0;
}

輸出結(jié)果:

執(zhí)行基類構造函數(shù)
執(zhí)行派生類構造函數(shù)
執(zhí)行基類析構函數(shù)

虛析構函數(shù)

當基類的析構函數(shù)為虛函數(shù)時, 無論指針指的是同一族中的哪一個類對象, 系統(tǒng)會采用動態(tài)關聯(lián), 掉啊用相應的析構函數(shù), 對該對象進行清理工作. 即先調(diào)用了派生類的析構函數(shù), 再調(diào)用了基類的析構函數(shù).

Base 類:

#ifndef PROJECT6_BASE_H
#define PROJECT6_BASE_H

#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        cout << "執(zhí)行基類構造函數(shù)" << endl;
    };
    virtual ~Base() {
        cout << "執(zhí)行基類析構函數(shù)" << endl;
    };
};

#endif //PROJECT6_BASE_H

Derived 類:

#ifndef PROJECT6_DERIVED_H
#define PROJECT6_DERIVED_H

#include <iostream>
#include "Base.h"
using namespace std;

class Derived : public Base {
public:
    Derived() {
        cout << "執(zhí)行派生類構造函數(shù)" << endl;
    };
    ~Derived() {
        cout << "執(zhí)行派生類析構函數(shù)" << endl;
    }
};

#endif //PROJECT6_DERIVED_H

main:

#include <iostream>
#include "Derived.h"
using namespace std;

int main() {

    Base *pt =new Derived;
    delete pt;

    return 0;
}

輸出結(jié)果:

執(zhí)行基類構造函數(shù)
執(zhí)行派生類構造函數(shù)
執(zhí)行派生類析構函數(shù)
執(zhí)行基類析構函數(shù)

總結(jié)

如果將基類的析構函數(shù)聲明為虛函數(shù)時, 由該基類所派生的所有派生類的析構函數(shù)也都自動成為虛函數(shù). 即使派生類的析構函數(shù)與其基類的構造函數(shù)名字不相同.

最好把基類的析構函數(shù)聲明為虛函數(shù). 即使基類并不需要析構函數(shù), 我們也可以定義一個函數(shù)體為空的虛析構函數(shù), 以保證撤銷動態(tài)分配空間能正確的處理.

注: 構造函數(shù)不能聲明為虛函數(shù).

以上就是C++ virtual destructor虛擬析構函數(shù)的詳細內(nèi)容,更多關于C++虛擬析構函數(shù)的資料請關注腳本之家其它相關文章!

相關文章

最新評論