有純虛擬函式的類和有虛擬函式的類相比,又有什麼區別

2021-05-15 05:02:48 字數 3466 閱讀 3287

1樓:匿名使用者

純虛擬函式的類在其派生類中必須定義自己這個函式的版本,而且純虛擬函式是沒有實際意義的,他的目的告知編譯器派生類將會定義自己的版本。

類中擁有純虛擬函式表示這個類是抽象類,不存在此類的物件。

而虛擬函式僅表示派生類可以定義自己的版本,但是基類也可以有意義,若沒有定義自己的版本,將使用基類的版本。

2樓:匿名使用者

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

class 《類名》

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

[編輯本段]

二、引入原因

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()一樣,只是在基類中不需要寫函式實現.請參考

什麼是虛擬函式和純虛擬函式,有什麼區別

3樓:

虛擬函式是在基類中作總體框架定義,定義時在函式的返回型別名前加上virtual構成。它的具體不同實現版本是在其類的派生類裡實現的。純虛擬函式是在其類中連基本框架都定義不出來,所以只是用「virtual 型別名 函式名()=0;」的形式來宣告基類中有這麼一個函式,而它的實現則完全由基類的派生類根據不同需要來完成。

有純虛擬函式的基類叫抽象類,不能被例項化(即不能生成物件),只能被繼承。我的理解是:虛擬函式實現的具體版本中總是有通用的部分,這些通用部分可以在基類中定義,而純虛擬函式則完全沒有能共用的部分,完全是由派生類中不同的實現完成的。

供參考……

4樓:匿名使用者

自己看書吧,書上說的比誰都清楚。推薦一本, c++ primer plus...

c++ 虛擬函式和純虛擬函式的區別

5樓:周濤eric玄賧瞟

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是: (1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的**。

純虛擬函式一般沒有**實現部分,如 virtual void print() = 0; 而一般虛擬函式必須要有**的實現部分

《c++》中虛擬函式與純虛擬函式的區別是什麼?

6樓:月無痕

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:

(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的**。

純虛擬函式一般沒有**實現部分,如

virtual void print() = 0;

而一般虛擬函式必須要有**的實現部分,否則會出現函式未定義的錯誤。

virtual void print()

(2)包含純虛擬函式的類不能定義其物件,而包含虛擬函式的則可以。

c/c++面試題:虛擬函式與純虛擬函式有什麼區別

c++中 虛擬函式與純虛擬函式的區別是什麼?

7樓:月無痕

虛擬函式與純虛擬函式 在他們的子類中都可以被重寫。它們的區別是:

(1)純虛擬函式只有定義,沒有實現;而虛擬函式既有定義,也有實現的**。

純虛擬函式一般沒有**實現部分,如

virtual void print() = 0;

而一般虛擬函式必須要有**的實現部分,否則會出現函式未定義的錯誤。

virtual void print()

(2)包含純虛擬函式的類不能定義其物件,而包含虛擬函式的則可以。

虛擬函式和抽象函式有什麼區別?

8樓:許詩文

虛擬函式是有**的並明確允許子類去覆蓋,但子類也可不覆蓋,就是說可以直接用,不用重寫 。

抽象函式是沒有**,子類繼承後一定要重寫

在一個類中用虛擬函式:

是因為在超類中的有實際**的方法,但明確允許子類可以作重寫

而且當子類重寫後,可以用子類例項超類;如果這樣,超類變數呼叫虛擬函式時,執行的是子類的方法

在一個類中用抽象函式

是在寫超類時不確定函式的**,讓子類去實現

抽象函式沒有方法體。

簡單來說虛擬函式(virtual)已經包含了也必須包含預設的實現,所以在派生類中可以重新實現也可以不實現這些虛擬函式。

抽象函式(abstract)沒有提供預設實現,所以在派生類中必須實現這些抽象函式。

介面中的函式類似於抽象函式,也不提供預設實現,實現介面的類也必須實現這些函式。

但介面可用於多繼承,即,類只能從一個類繼承,但可同時實現多個介面。

9樓:匿名使用者

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

class <類名>

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

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

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

c純虛擬函式,C 中純虛擬函式有什麼作用

純虛擬函式就是抽象類函式。宣告是virtual void fn 0 沒有實現體的函式。補充一點,含有純虛擬函式的類是抽象類 純虛擬函式是一種特du殊的虛函zhi數,它的一般格式dao如下 專class 類名 屬 在許多情況下,在基類中不能對虛擬函式給出有意義有實現,而把它說明為純虛擬函式,它的實現留...

c在父類宣告純虛擬函式怎樣在父類建構函式

不能,就算中bai轉一下也不行,du因為這個zhi時候還虛擬函式表還沒有dao改寫,也就是說版純虛函權 數還沒有實現,函式指標指是空的。這是時序的問題。執行之後會報這個錯誤 libc abi.dylib pure virtual function called 1 2417 abort test而且...

C 中純虛擬函式和空的虛擬函式各自的作用是什麼呢?他們應該怎麼

虛擬函式是baic 多型的一種表現 du例如 子類繼承了 zhi父類的一個函式dao 方法 內 而我們把父類容的指標指向子類,則必須把父類的該函式 方法 設為virturl 虛擬函式 使用虛擬函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。如果父類的函式 方法 根本沒有必要或者無法實現,...