解除心頭的困惑--純虛擬函式 (轉)

worldblog發表於2008-01-21
解除心頭的困惑--純虛擬函式 (轉)[@more@]

  摘要:虛裡面有一個很特殊的東東,那就是純虛擬函式,關於純虛擬函式的問題也是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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章