純 虛函式意義

2021-04-15 01:38:26 字數 1323 閱讀 5213

一、引入原因:

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

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

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

二、純虛函式實質:

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

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

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

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

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

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

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

四、物件切片:

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

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

五、虛函式使用的缺點

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

在atl中通過以下方式解決:

atl的主要思想就是讓com元件盡可能的小,但是由於這一行為,介面類的建構函式就會擁有很多不必要的**。為了解決這一問題,atl引入了乙個巨集atl_no_vtable,它定義在atldef.h中:

#define atl_no_vtable __declspec(novtable)

__declspec(novtable)為microsoft c++擴充套件的類屬性。它會使編譯器不產生初始化虛函式表指標和虛函式表的**,這樣一來就減少了生成**的尺寸。

另附乙個很實用的實驗多型性,虛函式表機制的實驗性文章連線:

虛函式 純虛函式

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

虛函式 純虛函式

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

虛函式和純虛函式

除了繼承外,c 的另乙個優良特性是支援多型,即允許將派生類的物件當作基類的物件使用。如果a是基類,b和c是a的派生類,多態函式test的引數是a的指標。那麼test函式可以引用a b c的物件。示例程式如下 class a void test a a class b public a class c...