C 學習25 純虛函式和抽象類

2022-07-16 10:09:07 字數 1934 閱讀 7929

在c++中,可以將成員函式宣告為純虛函式,語法格式為:

virtual 函式返回型別 函式名 (函式引數) = 0;

純虛函式沒有函式體,只有函式宣告,在虛函式宣告結尾加上=0,表明此函式為純虛函式。

最後的=0並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統「這是純虛函式」。

包含純虛成員函式的類稱為抽象類(abstract class)。之所以說它抽象,是因為它無法例項化,也就是無法建立物件。原因很明顯,純虛函式沒有函式體,不是完整的函式,無法呼叫,也無法為其分配記憶體空間。

抽象類通常是作為基類,讓派生類去實現純虛函式。派生類必須實現純虛函式才能被例項化。

純虛函式使用舉例:

#include using

namespace

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 析構函式通常宣告為虛函式,這樣在有繼承場合...