概述
虛析構函數 (virtual destructor) 可以幫我們實現基類指針刪除派生類對象.
問題
當我們從派生類的對象從內存中撤銷時會先調用派生的析構函數, 然后再基類的析構函數, 由此就會產生問題:
- 如果用 new 運算符建立了派生類對象, 并且由一個基類的指針比那里指向該對象
- 用 delete 運算符撤銷對象時, 系統只執行基類的析構函數. 而不執行派生類的析構函數, 派生類對象析構中要求的工作將被忽略
Base 類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#ifndef PROJECT6_BASE_H #define PROJECT6_BASE_H #include <iostream> using namespace std; class Base { public : Base() { cout << "執行基類構造函數" << endl; }; ~Base() { cout << "執行基類析構函數" << endl; }; }; #endif //PROJECT6_BASE_H |
Derived 類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#ifndef PROJECT6_DERIVED_H #define PROJECT6_DERIVED_H #include <iostream> #include "Base.h" using namespace std; class Derived : public Base { public : Derived() { cout << "執行派生類構造函數" << endl; }; ~Derived() { cout << "執行派生類析構函數" << endl; } }; #endif //PROJECT6_DERIVED_H |
main:
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream> #include "Derived.h" using namespace std; int main() { Base *pt = new Derived; delete pt; return 0; } |
輸出結果:
執行基類構造函數
執行派生類構造函數
執行基類析構函數
虛析構函數
當基類的析構函數為虛函數時, 無論指針指的是同一族中的哪一個類對象, 系統會采用動態關聯, 掉啊用相應的析構函數, 對該對象進行清理工作. 即先調用了派生類的析構函數, 再調用了基類的析構函數.
Base 類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#ifndef PROJECT6_BASE_H #define PROJECT6_BASE_H #include <iostream> using namespace std; class Base { public : Base() { cout << "執行基類構造函數" << endl; }; virtual ~Base() { cout << "執行基類析構函數" << endl; }; }; #endif //PROJECT6_BASE_H |
Derived 類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#ifndef PROJECT6_DERIVED_H #define PROJECT6_DERIVED_H #include <iostream> #include "Base.h" using namespace std; class Derived : public Base { public : Derived() { cout << "執行派生類構造函數" << endl; }; ~Derived() { cout << "執行派生類析構函數" << endl; } }; #endif //PROJECT6_DERIVED_H |
main:
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream> #include "Derived.h" using namespace std; int main() { Base *pt = new Derived; delete pt; return 0; } |
輸出結果:
執行基類構造函數
執行派生類構造函數
執行派生類析構函數
執行基類析構函數
總結
如果將基類的析構函數聲明為虛函數時, 由該基類所派生的所有派生類的析構函數也都自動成為虛函數. 即使派生類的析構函數與其基類的構造函數名字不相同.
最好把基類的析構函數聲明為虛函數. 即使基類并不需要析構函數, 我們也可以定義一個函數體為空的虛析構函數, 以保證撤銷動態分配空間能正確的處理.
注: 構造函數不能聲明為虛函數.
以上就是C++ virtual destructor虛擬析構函數的詳細內容,更多關于C++虛擬析構函數的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/weixin_46274168/article/details/116827263