虛函式和抽象類

2021-06-26 23:40:30 字數 2685 閱讀 1127

虛函式是c++多型的一種表現 ,例如:子類繼承了父類的乙個函式(方法),而我們把父類的指標指向子類,則必須把父類的該函式(方法)設為virturl(虛函式)。 使用虛函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。

如果父類的函式(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函式(方法)設為virturl 函式名=0 。我們把這樣的函式(方法)稱為純虛函式。 如果乙個類包含了純虛函式,稱此類為抽象類。

一、定義.

純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加「=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. 虛函式和純虛函式可以定義在同乙個類(class)中,含有純虛函式的類被稱為抽象類(abstract class),而只含有虛函式的類(class)不能被稱為抽象類(abstract class)。

2. 虛函式可以被直接使用,也可以被子類(sub class)過載以後以多型的形式呼叫,而純虛函式必須在子類(sub class)中實現該函式才可以使用,因為純虛函式在基類(base class)

只有宣告而沒有定義。

3. 虛函式和純虛函式都可以在子類(sub class)中被過載,以多型的形式被呼叫。

4. 虛函式和純虛函式通常存在於抽象基類(abstract base class -abc)之中,被繼承的子類過載,目的是提供乙個統一的介面。

5. 虛函式的定義形式:virtual     

純虛函式的定義形式:virtual    = 0; 

在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結(run-time bind),而且被兩者修飾的函式生命週期(life recycle)也不一樣。

6. 如果乙個類中含有純虛函式,那麼任何試圖對該類進行例項化的語句都將導致錯誤的產生,因為抽象基類(abc)是不能被直接呼叫的。必須被子類繼承過載以後,根據要求呼叫其子類的方法。

以下為乙個簡單的虛函式和純虛寒數的使用演示,目的是拋磚引玉!

#include 

//father class

class virtualbase

;//sub class

class subvirtual :public virtualbase

;/*           instance class and sample                 */

void main()

純虛函式和抽象類

純虛函式和抽象類 語法格式 virtual 返回值型別 函式名 引數 0 1 純虛函式沒有函式體,之有 宣告 0.只表示是純虛函式,2 0 不表示返回值是0,只是乙個形式,告訴編譯器這是純虛函式 3 包含純虛函式的類稱為抽象類 4 抽象類通常稱為基類,讓派生類去實現純虛函式。派生類必須實現純虛函式才...

純虛函式和抽象類

一.純虛函式和抽象類的概念 用 顯示 class figure 抽象類 注意一下幾點 figure c1 錯誤,抽象類不能建立物件 figure p null 正確,抽象類可以宣告自己的指標 figure fun 錯誤,抽象類不能作為返回型別 void fun figure 錯誤,抽象類不能作為引數...

純虛函式和抽象類

虛函式的定義就不囉嗦了,純虛函式和虛函式類似,但是不提供實現!啥意思呢?見下面的例子 這個方法就是純虛函式,別丟了後邊那個 0,它是用來留給子類去實現的。這下大家或許會疑惑,那麼包含了這個函式的類怎麼建立物件呢?事實上這個類是建立不了例項的,因為包含了乙個及以上個純虛函式的類被稱為抽象類。抽象類是不...