C++解構函式必須要用virtual修飾的原因
1
--
2
1
如果不用virtual函式,是沒有執行期繫結一說的,比如pObj1這個指標,其實它是Child物件,但是在釋放時,~Child()方法並沒有被呼叫,僅呼叫了~Father方法。為什麼呢?因為沒有用virtual,就是編譯期繫結,當你在編譯時gcc/g++只知道pObj1是個Father物件,所以在delete時就去呼叫Father的析構了。
而如果定義成virtual ~Father時,結果就是一定會析構Child,這就是為什麼解構函式都要用virtual,因為沒人知道會不會有子類繼承,否則一旦繼承,發生這樣的事,解構函式裡萬一釋放了些資源,比如SOCKET,比如memory,那就是資源洩露了。
相關推薦
C++解構函式必須要用virtual修飾的原因
執行結果: 1 -- 2 1 如果不用virtual函式,是沒有執行期繫結一說的,比如pObj1這個指標,其實它是Child物件,但是在釋放時,~Child()方法並沒有被呼叫,僅呼叫了~Father方法。為什麼呢?因為沒有用virtual,就是編譯期繫結,當你在編譯時gcc/g++只知道pObj1是個Fat
C++中基類的解構函式為什麼要用virtual虛解構函式【轉】
(轉自:https://blog.csdn.net/iicy266/article/details/11906457) 知識背景 要弄明白這個問題,首先要了解下C++中的動態繫結。&n
C++中基類的解構函式為什麼要用virtual虛解構函式
知識背景 要弄明白這個問題,首先要了解下C++中的動態繫結。 正題 直接的講,C++中基類採用virtual虛解構函式是為了防止記憶體洩漏。具體地說,如果派生類中申請了記憶體空間,並在其解構函式中對這些記憶體空間進行釋放
C++解構函式前加上virtual的原因
class A { public: virtual void print(){cout<<"This is A"<<endl;} }; class B : public A { public: void print(){cout<
C++解構函式後加上virtual的原因
C++解構函式加上virtual是為了防止記憶體洩漏。 用在C++實現多型的時候,其基類要加virtual。 原因跟動態繫結有關,大家都知道,多型是通過虛擬函式實現的,而虛擬函式又是通過動態繫結實現的。 先舉個例子: class Base { public: virt
【C/C++開發】C++ 解構函式以及 delete 和delete[]的整理
轉自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的區別: C++告訴我們在回收用 new 分配的單個物件的記憶體空間的時候用 delete,回收用 new[] 分配的一組物
C#解構函式
不能在結構中定義解構函式。只能對類使用解構函式。 一個類只能有一個解構函式。 無法繼承或過載解構函式。 無法呼叫解構函式。它們是被自動呼叫的。 解構函式既沒有修飾符,也沒有引數。 例如,下面是類 Car 的解構函式的宣告: class Car { pu
c++解構函式三分法則
對於新手來說,解構函式常常漏掉,導致記憶體洩漏這裡寫的還不夠完整,請多參考相關書籍設計一個類時,如何寫解構函式? 解構函式如果我們不寫的話,C++ 會幫我們自動的合成一個,就是說:C++ 會自動的幫我們寫一個解構函式。很多時候,自動生成的解構函式可以很好的工作,但是一些重要的
C++解構函式為什麼要為虛擬函式
在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 a.第一段程式碼 #include<iostream> using namespace std; class ClxBase{ public: ClxBase() {}; ~ClxBa
深度剖析C++解構函式
建構函式和解構函式在C中意味著生命週期的開始和結束,它們的實現原理相同。由於解構函式往往還設定成虛擬函式,所以這裡我重點介紹下C解構函式的原理和各種場景。一、解構函式的作用 當物件的生命週期結束時,會自動呼叫解構函式,以清理一些資源,比如釋放記憶體、關閉檔案、關閉資料庫連
C++---之帶有virtual的解構函式概念
C++解構函式加上virtual是為了防止記憶體洩漏。 用在C++實現多型的時候,其基類要加virtual。 原因跟動態繫結有關,大家都知道,多型是通過虛擬函式實現的,而虛擬函式又是通過動態繫結實現的。 先舉個例子: class Base {
Effective C++筆記之七:為多型基類宣告virtual解構函式
應該為多型基類宣告virtual解構函式,否則容易造成記憶體洩露。 因為C++明白指出,當derived class物件經由一個base class指標被刪除,而該base class如果帶有一個non-virtual解構函式,其結果未定義一實際執行時通常發生的是物件的derived成分沒
effective c++乾貨之條款07:為多型基類宣告virtual解構函式
1. 避免記憶體洩漏 首先,我們實現一個多型: class CPeople { public: CPeople(){} virtual ~CPeople(){} }; class CChinese:public CPeople { public:
C++使用virtual解構函式的原因
1.如果基類中的成員函式是virtual型別的,其繼承類中相應的函式也是virtual型別,並且基類物件的引用指向繼承類物件時, 基類就可以呼叫繼承類函式,否則呼叫的是基類函式 class base { public: virtual void fun(){ p
讀書筆記《Effective c++》 條款07 為多型基類宣告virtual解構函式
這個其實不用多說,用過OO類的語言應該都要這樣。 這麼看來簡單的物件和delphi的物件結構差不多。 書中說c++不支援final,在c++11中已經支援了,所以如果不希望類被繼承,可以加上final c++的final有兩個用途: 1.阻止類被繼承 2.組織虛擬函式被
[收集]c++抽象類、純虛擬函式以及巧用純虛解構函式實現介面類
在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要在基類宣告某函式的情況,而不需要寫具體的實現,那C++中是如何實現這一功能的,答案是純虛擬函式。 含有純虛擬函式的類是抽象類,不能生成物件,只能派生。
C++學習:虛擬函式,純虛擬函式(virtual),虛繼承,虛解構函式
C++學習:虛擬函式,虛繼承,純虛擬函式(virtual)虛解構函式 虛擬函式 純虛擬函式 虛解構函式 虛繼承 簡介 在java這種高階語言中,有abstract和interface這兩個關鍵字.代表的是抽象類和介面,但是在C++這門語言中
用例項程式碼理解一下c++11”定義解構函式阻止合成移動”
先普及一下基本知識: 1、移動:int &&a = b; 將b移動給a,會避免一些物件複製,移動之後,b就沒有用了。 2、析構:物件釋放時,執行的清理函式。 原理很好理解:如果定義了解構函式,則說明清理工作有一些個性化,成員資料如果執行了移動 ,會產生掃尾
C/C++基類的解構函式為什麼必須定義為虛擬函式?
C/C++基類的解構函式為什麼必須定義為虛擬函式? 為什麼基類的解構函式是虛擬函式? 在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 (1)第一種情況:沒有多型,建立派生類物件,基類的解構函式不是虛擬函式 #include<
1、【C++】類&物件/建構函式/拷貝建構函式/操作符過載/解構函式
一、C++類 & 物件 C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。 類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在