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ù)的資料請關注腳本之家其它相關文章!
相關文章
C語言調(diào)用go生成的動態(tài)庫的踩坑過程解析
這篇文章主要為大家介紹了C語言調(diào)用go生成的動態(tài)庫的踩坑過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09一文帶你入木三分地理解字符串KMP算法以及C++實現(xiàn)
KMP算法是一種改進的字符串匹配算法,KMP算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達到快速匹配的目的。本文就來和大家聊聊KMP算法的原理與實現(xiàn),需要的可以參考一下2022-12-12C++實現(xiàn)數(shù)字轉(zhuǎn)換為十六進制字符串的方法
這篇文章主要介紹了C++實現(xiàn)數(shù)字轉(zhuǎn)換為十六進制字符串的方法,涉及C++操作數(shù)字與字符串轉(zhuǎn)換的相關技巧,需要的朋友可以參考下2015-06-06