C 基礎 純虛函式和抽象類

2021-05-23 21:42:26 字數 3108 閱讀 7408

c++基礎:純虛函式和抽象類

純虛函式是一種特殊的虛函式,它的一般格式如下:

class 《類名》

;在許多情況下,在基類中不能對虛函式給出有意義有實現,而把它說明為純虛函式,它的實現留給該基類的派生類去做。這就是純虛函式的作用。下面給出乙個純虛函式的例子。

#include

class point

virtual void set() = 0;

virtual void draw() = 0;

protected:

int x0, y0;

};class line : public point

void set()

void draw()

protected:

int x1, y1;

};class ellipse : public point

void set()

void draw()

protected:

int x2, y2;

};void drawobj(point *p)

void setobj(point *p)

void main()

抽象類帶有純虛函式的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的較上層。抽象類是不能定義物件的,在實際中為了強調乙個類是抽象類,可將該類的建構函式說明為保護的訪問控制許可權。

抽象類的主要作用是將有關的組織在乙個繼承層次結構中,由它來為它們提供乙個公共的根,相關的子類是從這個根派生出來的。

抽象類刻畫了一組子類的操作介面的通用語義,這些語義也傳給子類。一般而言,抽象類只描述這組子類共同的操作介面,而完整的實現留給子類。

抽象類只能作為基類來使用,其純虛函式的實現由派生類給出。如果派生類沒有重新定義純虛函式,而派生類只是繼承基類的純虛函式,則這個派生類仍然還是乙個抽象類。如果派生類中給出了基類純虛函式的實現,則該派生類就不再是抽象類了,它是乙個可以建立物件的具體類了。 

在物件導向的概念中,我們知道所有的物件都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪物件的,如果乙個類中沒有包含足夠的資訊來描繪乙個具體的物件,這樣的類就是抽象類。抽象類往往用來表徵我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行乙個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣乙個概念,形狀這個概念在問題領域是不存在的,它就是乙個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能夠例項化的。

一、定義.

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=0」

virtual void funtion1()=0

二、引入原因:

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

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

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

三、相似概念:

1、多型性

指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。

a.編譯時多型性:通過過載函式實現

b 執行時多型性:通過虛函式實現。

2、虛函式

虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載

3、抽象類

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

程式舉例:

基類:class a 

;子類:

class b : public a 

;主函式:

int main(int argc, char* argv)

f1()是乙個普通的過載.

呼叫m_j->f1();會去呼叫a類中的f1(),它是在我們寫好**的時候就會定好的.

也就是根據它是由a類定義的,這樣就呼叫這個類的函式.

f2()是虛函式.

呼叫m_j->f2();會呼叫m_j中到底儲存的物件中,對應的這個函式.這是由於new的b

物件.f3()與f2()一樣,只是在基類中不需要寫函式實現.

抽象就是把有共同屬性或方法的抽象成乙個類

實現不了自己定義的介面(純虛函式)就是抽象類。反過來想。如:我們定義了動物的類,屬性是有嘴,方法是 吃。我們沒有定義吃的具體實現。在派生類 老虎裡 定義了 吃的 具體實現  吃肉,派生類 牛 裡定義了 吃 的 具體實現 吃草,這就說明動物這個類 是抽象類,決定不了吃的具體實現,必須實現了吃 這個介面的類才不是抽象的類。如果實現了 吃的方法,那動物這個類就不能就不能通過介面說明 它是個抽象類。

定義純虛函式就是把派生類裡的共同的方法抽象出來放到基類裡,但並沒有具體實現(描述)(因為是抽象的無法具體描述物件),派生類裡對這些共同的方法來描述。如果乙個類中沒有包含足夠的資訊來描繪乙個具體的物件,這樣的類就是抽象類。把』吃肉『,』吃草『的共同方法』吃『提取出來,那麼動物就是抽象類。

將函式定義為純虛函式能夠說明,該函式為後代型別提供了可以覆蓋的介面,但是這個類中的版本決不會呼叫。

為什麼說只要擁有純虛函式的類就是抽象類?

派生類能夠描述物件的資訊,而基類類卻不能描述此類物件的資訊(即純虛函式),就是抽象類。

抽象類定義是物件有共同屬性或方法抽象成乙個類,但無法描述具體的物件(肯定無法描述),它是不存在的

首先 基類裡 存在著派生類的 共同的屬性 方法,但是如果是虛函式的話,基類的方法就和派生不一樣了,因為虛函式是動態繫結,它改寫基類的虛函式後,就與基類的實現不同了,這樣基類就沒有提取派生類的共同方法,基類也不是抽象類。如果定義為純虛函式,則基類的純虛函式就是個介面,純虛函式不能被呼叫,它的存在只是為了在派生類中重新定義。通過純虛函式的定義來確定抽象類以區別具體類。(同樣的方法因為派生類能夠呼叫而基類不能呼叫,所以是抽象類)抽象類也就是無法例項化。

C 純虛函式和抽象類

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

c 純虛函式和抽象類

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

C 虛函式和純虛函式和抽象類

虛函式是類的一種特殊成員函式,主要是為實現c 的多型特性引入。虛函式之所以 虛 是因為呼叫的虛函式不是在靜態編譯 靜態編聯 時確定,而是在執行時通過動態編聯確定的。多型核心理念即是通過基類訪問派生的子類,通常情況是借助基類指標來訪問派生類物件。note 1 析構函式通常宣告為虛函式,這樣在有繼承場合...