解除心頭的困惑--純虛擬函式 (轉)
摘要:虛裡面有一個很特殊的東東,那就是純虛擬函式,關於純虛擬函式的問題也是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++抽象函式
- C++ 介面(純虛擬函式)C++函式
- 抽象基類和純虛擬函式抽象函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- C++:純虛擬函式與抽象類C++函式抽象
- 虛擬函式,虛擬函式表函式
- 我對C++中虛擬函式、純虛擬函式在實現多型中作用的一點淺薄認識 (轉)C++函式多型
- C++純虛擬函式簡介及區別C++函式
- 【C++基礎】純虛擬函式 - pure virtual functionC++函式Function
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 021--C++養成之路(純虛擬函式和純抽象類)C++函式抽象
- 虛擬函式實現原理(轉)函式
- 虛擬函式函式
- C++虛擬函式解析(轉載)C++函式
- C++繼承三之純虛擬函式pure virtual functionC++繼承函式Function
- 虛擬函式的呼叫原理函式
- 【虛擬函式】C++中虛擬函式的作用是什麼?它應該怎麼用呢?[轉]函式C++
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- Guru of the Week #5:虛擬函式的重新定義 (轉)函式
- C++ 虛擬函式C++函式
- C++虛擬函式C++函式
- 虛擬函式釋義函式
- 虛擬函式的實現原理函式
- C++ 中的虛擬函式C++函式
- 用虛擬函式實現事件驅動! (轉)函式事件
- c++虛擬函式表C++函式
- C++虛擬函式bugC++函式
- 虛擬函式與多型函式多型
- C++中虛擬函式的作用C++函式
- C++虛擬函式與多型實戰 (轉)C++函式多型
- Guru of the Week 條款05:覆寫虛擬函式 (轉)函式
- C++ 虛擬函式表剖析C++函式
- C++ 虛擬函式表解析C++函式
- const修飾虛擬函式函式
- [CareerCup] 13.3 Virtual Functions 虛擬函式Function函式