解除心頭的困惑--純虛擬函式 (轉)
摘要:虛裡面有一個很特殊的東東,那就是純虛擬函式,關於純虛擬函式的問題也是bbs上常見的話題,這裡我想對此作一個小小的論述,希望能給初學者一個滿意的解釋。
一、引入原因:
1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。
2、在很多情況下,基類本身生成是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。
為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual ReturnType Function()= 0;),則要求在派生類中必須予以過載以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。
二、純虛擬函式實質:
類中含有純虛擬函式則它的VTABLE表不完全,有一個空位,所以,不能生成物件(編譯器絕對不允許有一個不存在函式的可能)。在它的派生類中,除非過載這個函式,否則,此派生類的VTABLE表亦不完整,亦不能生成物件,即它也成為一個純虛基類。
三、 虛擬函式與構造、解構函式:
1、建構函式本身不能是虛擬函式;並且虛機制在建構函式中不起作用(在建構函式中的虛擬函式只會呼叫它的本地版本)。
想一想,在基類建構函式中使用虛機制,則可能會呼叫到子類,此時子類尚未生成,有何後果!?。
2、解構函式本身常常要求是虛擬函式;但虛機制在解構函式中不起作用。
若類中使用了虛擬函式,解構函式一定要是虛擬函式,比如使用虛擬機器制呼叫delete,沒有虛擬的解構函式,怎能保證delete的是你希望delete的物件。
虛機制也不能在解構函式中生效,因為可能會引起呼叫已經被delete掉的類的虛擬函式的問題。
四、物件切片:
向上對映(子類被對映到父類)的時候,會發生子類的VTABLE 完全變成父類的VTABLE的情況。這就是物件切片。
原因:向上對映的時候,介面會變窄,而編譯器絕對不允許有呼叫一個不存在函式的可能,所以,子類中新派生的虛擬函式的入口在VTABLE中會被強行“切”掉,從而出現上述情況。
五、虛擬函式使用的缺點
優點講了一大堆,現在談一下缺點,虛擬函式最主要的缺點是較低,看一看虛擬函式引發的多型性的實現過程,你就能體會到其中的原因。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997978/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 虛擬函式 純虛擬函式函式
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- C++ 介面(純虛擬函式)C++函式
- 抽象基類和純虛擬函式抽象函式
- 虛擬函式,虛擬函式表函式
- 021--C++養成之路(純虛擬函式和純抽象類)C++函式抽象
- 基類指標、虛純虛擬函式、多型性、虛析構指標函式多型
- C++純虛擬函式簡介及區別C++函式
- [Lang] 虛擬函式函式
- 虛擬函式的呼叫原理函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 虛擬函式的實現原理函式
- c++虛擬函式表C++函式
- 虛擬函式與多型函式多型
- 內聯(inline)函式與虛擬函式(virtual)的討論inline函式
- C++ 虛擬函式表解析C++函式
- 深入C++成員函式及虛擬函式表C++函式
- 虛擬函式的記憶體佈局(上)函式記憶體
- 關於虛擬函式的一些理解函式
- C++多型之虛擬函式C++多型函式
- C++虛擬函式學習總結C++函式
- C++之類解構函式為什麼是虛擬函式C++函式
- kvm純命令建立虛擬機器虛擬機
- setV:一個管理 Python 虛擬環境的 Bash 函式Python函式
- 詳解C++中的多型和虛擬函式C++多型函式
- 虛擬函式表-C++多型的實現原理函式C++多型
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- 箭頭函式、簡寫函式、普通函式的區別函式
- 避免對派生的非虛擬函式進行重定義函式
- Java常見知識點彙總(④)——虛擬函式、抽象函式、抽象類、介面Java函式抽象
- 箭頭函式中的this函式
- c++虛擬函式實現計算表示式子C++函式
- 箭頭函式與普通函式的區別函式
- # 普通函式和箭頭函式的區別函式
- C++物件導向總結——虛指標與虛擬函式表C++物件指標函式
- 箭頭函式函式
- javascript純函式是什麼JavaScript函式