深入探索c 物件模型 抽象類和純虛函式的理解

2021-06-20 15:37:48 字數 1002 閱讀 9465

純虛函式是一種特殊的虛函式,在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,它的實現留給該基類的派生類去做。這就純虛函式的作用。其提出主要出於一下兩方面的原因:

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

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

為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;)。若要使派生類為非抽象類,則編譯器要求在派生類中,必須對純虛函式予以重寫以實現多型性。

包含純虛函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛函式,所以不能定義抽象類的物件

(一)對於抽象類而言,是否應該自己負責初始化類內的資料成員?(別忘了抽象類也可以有非純虛函式和資料成員)

class的data member應該被初始化,而且只在constructor中或其它member functions中初始化,其它任何操作都將破壞其封裝性質,使其維護和修改更加困難。

(二)純虛函式的呼叫

(a)可以定義和呼叫乙個純虛函式,但是只能夠被靜態的呼叫,不能由虛擬機制呼叫。

(b)這種呼叫完全有class的設計值自己決定。

(c)唯一的類外是pure virtua destructor,class設計者必須得定義它。原因是派生類的析構函式會被編譯器進行擴充,以靜態方式呼叫虛基類及更高層次的基類的

析構函式。若缺少任何乙個基類的析構函式的定義,會是編譯器產生鏈結錯誤。

(d)比較好的處理方法是:不要把virtual destructor 定義為pure。

(a)不加選擇地將函式設定為virtual在效率上會不公升反降,不能依賴編譯器的優化。

(a)應付const也會令人頭疼,例如在基類中不需要修改的const ref或者const pointer,到了子類就需要修改了。

(b)目前最好的方法是不用const。

參考部落格對該仁兄學習態度給予敬意。

C 純虛函式和抽象類

本文 在介紹抽象類之前,我們先介紹一下純虛函式。1.純虛函式 在基類中僅僅給出宣告,不對虛函式實現定義,而是在派生類中實現。這個虛函式稱為純虛函式。普通函式如果僅僅給出它的宣告而沒有實現它的函式體,這是編譯不過的。純虛函式沒有函式體。純虛函式需要在宣告之後加個 0 class 基類名 2.抽象類 含...

c 純虛函式和抽象類

在c 多型中,父類的作用就是提供乙個虛函式類方便進行多型,那麼實際上父類的用處幾乎等於沒有,所以c 提供了純虛函式和抽象類 純虛函式的語法 virtual 返回值型別 函式名 引數列表 0 只要在類中建立出純虛函式,那麼這個類就會變成抽象類,無法例項化物件,也就是無法建立物件,同時如果他的子類沒有重...

c 抽象類 純虛函式

1 錄入下面程式,分析編譯錯誤資訊。include include include using namespace std class abstract virtual void f 0 int main 分析 這個程式最大的問題就是abstract p new abstract 定義了乙個抽象類的...