解除心頭的困惑 純虛函式

2021-06-01 00:02:41 字數 1086 閱讀 8813

摘要:虛函式裡面有乙個很特殊的東東,那就是純虛函式,關於純虛函式的問題也是bbs上常見的話題,這裡我想對此作乙個小小的論述,希望能給初學者乙個滿意的解釋。

一、引入原因:

1、為了方便使用多型特性,我們常常需要在基類中定義虛函式。

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以過載以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

二、純虛函式實質:

類中含有純虛函式則它的vtable表不完全,有乙個空位,所以,不能生成物件(編譯器絕對不允許有呼叫乙個不存在函式的可能)。在它的派生類中,除非過載這個函式,否則,此派生類的vtable表亦不完整,亦不能生成物件,即它也成為乙個純虛基類。

三、 虛函式與構造、析構函式:

1、建構函式本身不能是虛函式;並且虛機制在建構函式中不起作用(在建構函式中的虛函式只會呼叫它的本地版本)。

想一想,在基類建構函式中使用虛機制,則可能會呼叫到子類,此時子類尚未生成,有何後果!?。

2、析構函式本身常常要求是虛函式;但虛機制在析構函式中不起作用。

若類中使用了虛函式,析構函式一定要是虛函式,比如使用虛擬機制呼叫delete,沒有虛擬的析構函式,怎能保證delete的是你希望delete的物件。

虛機制也不能在析構函式中生效,因為可能會引起呼叫已經被delete掉的類的虛函式的問題。

四、物件切片:

向上對映(子類被對映到父類)的時候,會發生子類的vtable 完全變成父類的vtable的情況。這就是物件切片。

原因:向上對映的時候,介面會變窄,而編譯器絕對不允許有呼叫乙個不存在函式的可能,所以,子類中新派生的虛函式的入口在vtable中會被強行「切」掉,從而出現上述情況。

五、虛函式使用的缺點

優點講了一大堆,現在談一下缺點,虛函式最主要的缺點是執行效率較低,看一看虛函式引發的多型性的實現過程,你就能體會到其中的原因。

本文**:

解除心頭的困惑 純虛函式

摘要 虛函式裡面有乙個很特殊的東東,那就是純虛函式,關於純虛函式的問題也是bbs上常見的話題,這裡我想對此作乙個小小的論述,希望能給初學者乙個滿意的解釋。一 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以...

虛函式 純虛函式

一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...

虛函式 純虛函式

虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標引用來訪問基類和派生類中的同名函式。include using namespace std class student student類成員函式的實現 宣告抽象基類shape class shape virtual float...