解構函式定義為虛擬函式的好處
當通過基類的指標去刪除派生類的物件,而基類又沒有虛解構函式時,結果將是不可確定的。
糾結了半天看文字還是有一些不確定和不明白,在網上搜集了一點資料與大家共勉。
解構函式是釋放資源,避免“資源洩漏”,更加安全。
對於基類和派生類的物件刪除問題,虛解構函式則能夠保證物件釋放時總是呼叫“物件自己的函式”。
舉個例子就清楚了,比如:
- Class A
- {
- ……
- Virtual ~A(){
- printf(“A::~A()”);
- }
- ……
- }
- Class B:public A
- {
- ……
- Virtual ~B(){
- printf(“B::~B()”);
- }
- ……
- }
- Void main()
- {
- B *b = new B();
- A *a = a;
- Delete a;
- }
- 上面的代買的執行結果是B::~B()
但是如果類A的西溝函式是非虛擬函式的話:
上面的程式碼的執行結果將是A::~A()
很明顯解構函式定義為虛擬函式的作用是為了程式能夠呼叫到正確的解構函式。
相關推薦
解構函式定義為虛擬函式的好處
在C++中有這麼一句話描述虛解構函式: 當通過基類的指標去刪除派生類的物件,而基類又沒有虛解構函式時,結果將是不可確定的。 糾結了半天看文字還是有一些不確定和不明白,在網上搜集了一點資料與大家共勉。 解構函式是釋放資源,避免“資源洩漏”,更加安全。 對於基類和派生類的物件刪除問題,虛解構函式則能夠保證
C/C++基類的解構函式為什麼必須定義為虛擬函式?
C/C++基類的解構函式為什麼必須定義為虛擬函式? 為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 (1)第一種情況:沒有多型,建立派生類物件,基類的解構函式不是虛擬函式 #include<
C++ 基類的解構函式為什麼需要定義為虛擬函式
主要是因為當通過父類的指標或引用指向子類的物件時,刪除子類時父類的解構函式不能被呼叫造成記憶體洩露。 1.當基類的引用指向基類的物件 #include<iostream> #include<cstring> #include<cstdlib> using
具有子類的類,解構函式儘量定義為虛擬函式
由於本人才疏學淺,本文難免存在遺漏之處,歡迎大家留言指正,本人將感激不盡。 一、使用new建立物件需要顯示的呼叫Delete來刪除物件,否則將造成記憶體洩漏。 程式碼如下所示 #include <iostream> using namespace
C++:為什麼在繼承關係中,父類的解構函式最好定義為虛擬函式?
我們先來看一段簡單程式碼,A類有一個指標成員_pa,B類公有繼承了A類,然後自己有一個指標成員_pb: class A{ public: A(int x = 1) :_pa(new int(x)) {} ~A()
C++中為什麼要將解構函式定義成虛擬函式
派生類的成員由兩部分組成,一部分是從基類那裡繼承而來,一部分是自己定義的。那麼在例項化物件的時候,首先利用基類建構函式去初始化從基類繼承而來的成員,再用派生類建構函式初始化自己定義的部分。 同時,不止建構函式派生類只負責自己的那部分,解構函式也是,所以派生
為什麼建構函式不能為虛擬函式,而解構函式可以為虛擬函式?
1. 為什麼建構函式不能為虛擬函式? 虛擬函式的呼叫需要虛擬函式表指標,而該指標存放在物件的內容空間中;若建構函式宣告為虛擬函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛擬函式表地址用來呼叫虛擬函式——構造函數了。 2. 為什麼解構函式可以為虛擬函式,如果不
(轉載)(C++)淺談多型基類解構函式宣告為虛擬函式
主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一
(C++)淺談多型基類解構函式宣告為虛擬函式
主要內容: 1、C++類繼承中的建構函式和解構函式 2、C++多型性中的靜態繫結和動態繫結 3、C++多型性中解構函式宣告為虛擬函式 1、C++類繼承中的建構函式和解構函式 在C++的類繼承中, 建立物件時,首先呼叫基類的建構函式,然後在呼叫下一個派生類的建構函式,依次類推; 析構物件時,其
虛擬函式實現機制、建構函式、解構函式能否為虛擬函式,與純虛擬函式
虛擬函式 虛擬函式是C++中用於實現多型的機制。核心理念就是通過基類指標訪問派生類中定義的函式。虛擬函式允許子類重新定義成員函式,繼承時不重新定義虛擬函式也是可以的。而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。如果父類或者祖先類中函式func()為虛
(轉)基類解構函式必須為虛擬函式否則會造成記憶體洩漏
看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public
基類解構函式必須為虛擬函式否則會造成記憶體洩漏
看看下面程式有什麼錯誤: #include <iostream> using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public Father { publi
將解構函式設定為虛擬函式,並且解構函式可以為純虛擬函式
為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 但如果不需要基類對派生類及物件進行操作,則不能定義虛擬函式,因為這樣會增加記憶體開銷.當類裡面有定義虛擬函式的時候,編譯器會給類新增一個虛擬函式表,裡面
C++基類解構函式宣告為虛擬函式
先來看幾段程式例子:1. 將基類解構函式宣告為虛擬函式#include <iostream
C++中為什麼建構函式不能定義為虛擬函式
關於C++為什麼不支援虛擬建構函式,Bjarne很早以前就在C++Style and Technique FAQ裡面做過回答 Avirtual call is a mechanism to get work done given partialinformation. In particular
為啥繼承時基類的析構一般宣告為虛擬函式
1、為啥繼承時基類的解構函式宣告為虛擬函式? 文字描述太抽象了,直接用程式碼給出答案。 (1)第一段程式碼: #include<iostream> using namespace std ; class Base { public: Base() {
新手學C/C++:解構函式是否必須為虛擬函式?什麼情況下才應該定義解構函式為虛擬函式?
多型是面向物件的一個基本屬性,包括靜態多型(編譯階段)和動態多型(執行階段),靜態多型主要是指函式引數不同產生的多型性,是在編譯階段可以識別的一種多型機制,而執行時多型則主要用於基類指標指向派生類物件時,可以通過基類指標直接呼叫派生類的物件函式,當然這種多型是通過虛擬函式實現的。 虛擬函式的目的
解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式
多型中的虛擬函式表是在執行時建立的還是編譯時建立的? 答:虛擬函式表在編譯的時候就確定了,而類物件的虛擬函式指標vptr是在執行階段確定的,這是實現多型的關鍵 (類的函式的呼叫並不是在編譯時就確定的,而是在執行時才確定的,由於編寫程式碼的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以宣告為虛
為什麼建構函式不能宣告為虛擬函式,解構函式可以
1. 如果我們定義了一個建構函式,編譯器就不會再為我們生成預設構造函數了。2. 編譯器生成的解構函式是非虛的,除非是一個子類,其父類有個虛析構,此時的函式虛特性來自父類。3. 有虛擬函式的類,幾乎可以確定要有個虛解構函式。4. 如果一個類不可能是基類就不要申明解構函式為虛擬函式,虛擬函式是要耗費空間的。5.
C++中解構函式為虛擬函式時呼叫發生了什麼變化
昨天去XX公司面試,面試官問了一個關於C++類解構函式為虛擬函式時,如果是父類的指標用子類來new,如果發生析構時,解構函式是virtual與不是virtual有什麼區別。當時答的不好,回來總結了一下,在機器上實現了一遍,終於搞明白了。記錄下來,以後遇到這種情況自己一定不要