C++ virtual destructor虛擬析構(gòu)函數(shù)
概述
虛析構(gòu)函數(shù) (virtual destructor) 可以幫我們實(shí)現(xiàn)基類指針刪除派生類對(duì)象.
問(wèn)題
當(dāng)我們從派生類的對(duì)象從內(nèi)存中撤銷時(shí)會(huì)先調(diào)用派生的析構(gòu)函數(shù), 然后再基類的析構(gòu)函數(shù), 由此就會(huì)產(chǎn)生問(wèn)題:
- 如果用 new 運(yùn)算符建立了派生類對(duì)象, 并且由一個(gè)基類的指針比那里指向該對(duì)象
- 用 delete 運(yùn)算符撤銷對(duì)象時(shí), 系統(tǒng)只執(zhí)行基類的析構(gòu)函數(shù). 而不執(zhí)行派生類的析構(gòu)函數(shù), 派生類對(duì)象析構(gòu)中要求的工作將被忽略
Base 類:
#ifndef PROJECT6_BASE_H #define PROJECT6_BASE_H #include <iostream> using namespace std; class Base { public: Base() { cout << "執(zhí)行基類構(gòu)造函數(shù)" << endl; }; ~Base() { cout << "執(zhí)行基類析構(gòu)函數(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í)行派生類構(gòu)造函數(shù)" << endl; }; ~Derived() { cout << "執(zhí)行派生類析構(gòu)函數(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í)行基類構(gòu)造函數(shù)
執(zhí)行派生類構(gòu)造函數(shù)
執(zhí)行基類析構(gòu)函數(shù)
虛析構(gòu)函數(shù)
當(dāng)基類的析構(gòu)函數(shù)為虛函數(shù)時(shí), 無(wú)論指針指的是同一族中的哪一個(gè)類對(duì)象, 系統(tǒng)會(huì)采用動(dòng)態(tài)關(guān)聯(lián), 掉啊用相應(yīng)的析構(gòu)函數(shù), 對(duì)該對(duì)象進(jìn)行清理工作. 即先調(diào)用了派生類的析構(gòu)函數(shù), 再調(diào)用了基類的析構(gòu)函數(shù).
Base 類:
#ifndef PROJECT6_BASE_H #define PROJECT6_BASE_H #include <iostream> using namespace std; class Base { public: Base() { cout << "執(zhí)行基類構(gòu)造函數(shù)" << endl; }; virtual ~Base() { cout << "執(zhí)行基類析構(gòu)函數(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í)行派生類構(gòu)造函數(shù)" << endl; }; ~Derived() { cout << "執(zhí)行派生類析構(gòu)函數(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í)行基類構(gòu)造函數(shù)
執(zhí)行派生類構(gòu)造函數(shù)
執(zhí)行派生類析構(gòu)函數(shù)
執(zhí)行基類析構(gòu)函數(shù)
總結(jié)
如果將基類的析構(gòu)函數(shù)聲明為虛函數(shù)時(shí), 由該基類所派生的所有派生類的析構(gòu)函數(shù)也都自動(dòng)成為虛函數(shù). 即使派生類的析構(gòu)函數(shù)與其基類的構(gòu)造函數(shù)名字不相同.
最好把基類的析構(gòu)函數(shù)聲明為虛函數(shù). 即使基類并不需要析構(gòu)函數(shù), 我們也可以定義一個(gè)函數(shù)體為空的虛析構(gòu)函數(shù), 以保證撤銷動(dòng)態(tài)分配空間能正確的處理.
注: 構(gòu)造函數(shù)不能聲明為虛函數(shù).
以上就是C++ virtual destructor虛擬析構(gòu)函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++虛擬析構(gòu)函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C++超詳細(xì)講解構(gòu)造函數(shù)與析構(gòu)函數(shù)的用法及實(shí)現(xiàn)
- C++分析類的對(duì)象作類成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
- C++深入講解對(duì)象的銷毀之析構(gòu)函數(shù)
- C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解
- C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的詳解及其作用介紹
- C++踩坑實(shí)戰(zhàn)之構(gòu)造和析構(gòu)函數(shù)
- 正確理解C++的構(gòu)造函數(shù)和析構(gòu)函數(shù)
- 詳解C++中的析構(gòu)函數(shù)
- C++超詳細(xì)講解析構(gòu)函數(shù)
相關(guān)文章
C語(yǔ)言調(diào)用go生成的動(dòng)態(tài)庫(kù)的踩坑過(guò)程解析
這篇文章主要為大家介紹了C語(yǔ)言調(diào)用go生成的動(dòng)態(tài)庫(kù)的踩坑過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09一文帶你入木三分地理解字符串KMP算法以及C++實(shí)現(xiàn)
KMP算法是一種改進(jìn)的字符串匹配算法,KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。本文就來(lái)和大家聊聊KMP算法的原理與實(shí)現(xiàn),需要的可以參考一下2022-12-12Qt基于QScrollArea實(shí)現(xiàn)界面嵌套移動(dòng)
在實(shí)際的應(yīng)用場(chǎng)景中,經(jīng)常會(huì)出現(xiàn)軟件界面戰(zhàn)場(chǎng)圖大于實(shí)際窗體大小。本文將利用QScrollArea可以為widget窗體添加滾動(dòng)條,實(shí)現(xiàn)界面嵌套移動(dòng),感興趣的可以了解一下2022-06-06C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法
這篇文章主要介紹了C++實(shí)現(xiàn)數(shù)字轉(zhuǎn)換為十六進(jìn)制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-06-06C++編程中的數(shù)據(jù)類型和常量學(xué)習(xí)教程
這篇文章主要介紹了C++編程中的數(shù)據(jù)類型和常量學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++實(shí)現(xiàn)時(shí)間轉(zhuǎn)換及格式化
這篇文章主要為大家詳細(xì)介紹了C++中實(shí)現(xiàn)時(shí)間轉(zhuǎn)換及格式化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11C++中賦值運(yùn)算符與逗號(hào)運(yùn)算符的用法詳解
這篇文章主要介紹了C++中賦值運(yùn)算符與逗號(hào)運(yùn)算符的用法詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09Matlab實(shí)現(xiàn)繪制立體玫瑰花的示例代碼
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制更立體的玫瑰花,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-02-02