1. 程式人生 > >C++解構函式必須要用virtual修飾的原因

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++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在