在c++中,可以將成員函式宣告為純虛函式,語法格式為:
virtual 函式返回型別 函式名 (函式引數) = 0;
純虛函式沒有函式體,只有函式宣告,在虛函式宣告結尾加上=0
,表明此函式為純虛函式。
最後的=0
並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統「這是純虛函式」。
包含純虛成員函式的類稱為抽象類(abstract class)。之所以說它抽象,是因為它無法例項化,也就是無法建立物件。原因很明顯,純虛函式沒有函式體,不是完整的函式,無法呼叫,也無法為其分配記憶體空間。
抽象類通常是作為基類,讓派生類去實現純虛函式。派生類必須實現純虛函式才能被例項化。
純虛函式使用舉例:
#include usingnamespace
std;//線
class
line
virtual
float area() = 0
;
virtual
float volume() = 0;};
//矩形
class rec: public
line
float area()
};//
長方體class cuboid: public
rec
float area()
float volume()
};//
正方體class cube: public
cuboid
float area()
float volume()
};int
main()
本例中定義了四個類,它們的繼承關係為:line --> rec --> cuboid --> cube。
line 是乙個抽象類,也是最頂層的基類,在 line 類中定義了兩個純虛函式 area() 和 volume()。
在 rec 類中,實現了 area() 函式;所謂實現,就是定義了純虛函式的函式體。但這時 rec 仍不能被例項化,因為它沒有實現繼承來的 volume() 函式,volume() 仍然是純虛函式,所以 rec 也仍然是抽象類。
直到 cuboid 類,才實現了 volume() 函式,才是乙個完整的類,才可以被例項化。
可以發現,line 類表示「線」,沒有面積和體積,但它仍然定義了 area() 和 volume() 兩個純虛函式。這樣的用意很明顯:line 類不需要被例項化,但是它為派生類提供了「約束條件」,派生類必須要實現這兩個函式,完成計算面積和體積的功能,否則就不能例項化。
在實際開發中,你可以定義乙個抽象基類,只完成部分功能,未完成的功能交給派生類去實現(誰派生誰實現)。這部分未完成的功能,往往是基類不需要的,或者在基類中無法實現的。雖然抽象基類沒有完成,但是卻強制要求派生類完成,這就是抽象基類的「霸王條款」。
抽象基類除了約束派生類的功能,還可以實現多型。請注意**第 39 行,指標 p 的型別是 line,但是它卻可以訪問派生類中的 area() 和 volume() 函式,正是由於在 line 類中將這兩個函式定義為純虛函式;如果不這樣做,39行後面的**都是錯誤的。我想,這或許才是c++提供純虛函式的主要目的。
關於純虛函式的幾點說明:
1) 乙個純虛成員函式就可以使類成為抽象基類,但是抽象基類中除了包含純虛成員函式外,還可以包含其它的成員函式(虛函式或普通函式)和成員變數。
2) 只有類中的虛函式才能被宣告為純虛成員函式,普通成員函式和頂層函式均不能宣告為純虛函式。如下例所示:
//頂層函式不能被宣告為純虛函式
void fun() = 0; //
compile error
class
base
;
C 純虛函式和抽象類
本文 在介紹抽象類之前,我們先介紹一下純虛函式。1.純虛函式 在基類中僅僅給出宣告,不對虛函式實現定義,而是在派生類中實現。這個虛函式稱為純虛函式。普通函式如果僅僅給出它的宣告而沒有實現它的函式體,這是編譯不過的。純虛函式沒有函式體。純虛函式需要在宣告之後加個 0 class 基類名 2.抽象類 含...
c 純虛函式和抽象類
在c 多型中,父類的作用就是提供乙個虛函式類方便進行多型,那麼實際上父類的用處幾乎等於沒有,所以c 提供了純虛函式和抽象類 純虛函式的語法 virtual 返回值型別 函式名 引數列表 0 只要在類中建立出純虛函式,那麼這個類就會變成抽象類,無法例項化物件,也就是無法建立物件,同時如果他的子類沒有重...
C 虛函式和純虛函式和抽象類
虛函式是類的一種特殊成員函式,主要是為實現c 的多型特性引入。虛函式之所以 虛 是因為呼叫的虛函式不是在靜態編譯 靜態編聯 時確定,而是在執行時通過動態編聯確定的。多型核心理念即是通過基類訪問派生的子類,通常情況是借助基類指標來訪問派生類物件。note 1 析構函式通常宣告為虛函式,這樣在有繼承場合...