虛擬函式和純虛擬函式的兩個基礎小問題

2021-04-19 01:28:38 字數 3741 閱讀 9000

1樓:**夢幻

純虛擬函式就是「強636f707962616964757a686964616f31333262373361制」要求在派生出具體類的時候 必須定義出的函式,否則該派生類就無法定義具體物件 而虛擬函式則可重新定義也可以不重新定義

--說得對。

而僅僅站在使用的角度去說,虛擬函式和純虛擬函式都可以實現多型的功能。

--說得對。

派生類如果繼承了抽象基類中的純虛擬函式,而在該派生類中沒有對此純虛擬函式進行定義 則該派生類扔為抽象類 不能用它實體定義物件

--說得對。

我的問題是:該派生類繼承過來的純虛擬函式在這個派生類中扔然為純虛擬函式麼??????

--說得對。

書上說不是...除非重新宣告成純虛擬函式...那是什麼?虛擬函式??我又沒有在這個派生類中具體定義繼承過來的這個純虛擬函式 為什麼就不是純虛擬函式了呢????

--其實,如果你不打算在某個派生類裡實現基類的純虛擬函式,那你最好連宣告都別宣告。如果宣告瞭,那就加上=0。

如果不宣告=0,編譯器會將它視為非純虛擬函式。

例如,基類base有純虛方法void fun()=0

class c1: public base

class c2: public c1

//有實現了

}這時你將無法例項化c2,因為c1的非純虛擬函式沒有實現,將產生連線錯誤。

base *p = new c2;

c1 *p1 = new c2;

c2 *p2 = new c2;

這些都無法連線成功。

2樓:伯伯煙塵

同意 **夢bai幻 的看法

du。當在父類裡宣告一個函式為zhi

虛擬函式後,那dao麼你例項化

內一個物件後,如果呼叫這個

容函式的話,如果你在子類中定義了這個函式(不需加virtual)的話,那麼就呼叫子類中的函式,父類中的就不呼叫了。 如果沒有定義,就呼叫父類的函式。

定義了純虛擬函式的類成為抽象類,該純虛擬函式必須被賦值為0。

該抽象類無法例項化物件,僅該類的子類可以例項化物件,並且抽象類中的純虛擬函式必須在子類中有定義。

請問關於虛擬函式與純虛擬函式的問題 20

3樓:

有純虛擬函式的類是抽象類,不能生成物件,只能派生。他派生的類的純虛擬函式沒有被改寫,那麼,它的派生類還是個抽象類。 定義純虛擬函式就是為了讓基類不可例項化化, 因為例項化這樣的抽象資料結構本身並沒有意義.

或者給出實現也沒有意義 實際上我個人認為純虛擬函式的引入,是出於兩個目的, 1.為了安全.因為避免任何需要明確但是因為不小心而導致的未知的結果.

提醒子類去做應做的實現. 2.為了效率,不是程式執行的效率,而是為了編碼的效率.

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

4樓:

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

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

供參考……

5樓:匿名使用者

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

c++中虛擬函式和純虛擬函式有什麼區別?

6樓:鍋勁

使用虛擬函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。 如果父類的函式(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函式(方法)設為virtual 函式名=0 我們把這樣的函式(方法)稱為純虛擬函式。

也就是說,虛擬函式 ,子類可以不重寫,直接繼承父類 的方法來使用,也可以重寫

但是 純虛擬函式是子類是必須重寫了才可以使用

7樓:衄潲

純虛擬函式,沒有方法體,留給子類去實現。而虛擬函式必須有方法體,子類可以重寫,也可以不重寫

8樓:匿名使用者

虛擬函式可是實現方法

純虛擬函式沒有函式體,也就是不能實現方法,只能給後面的派生類供宣告,後面跟著=0;

有純虛擬函式一般為抽象基類

9樓:匿名使用者

避免繼承帶來的二義性

c++中虛擬函式和純虛擬函式的作用與區別

10樓:匿名使用者

包含純虛擬函式的類不可以例項化。

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

11樓:匿名使用者

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

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

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

12樓:匿名使用者

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

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

以下哪個基類中的成員函式表示純虛擬函式

virtual void vf int 和void vf int 0基類中的成員函式表示純虛擬函式。純虛擬函式是一種特殊的虛擬函式,在許多情況下,回在基類中不能對虛答函式給出有意義的實現,而把它宣告為純虛擬函式,它的實現留給該基類的派生類去做。這就是純虛擬函式的作用.在許多情況下,在基類中不能對虛擬...

C的抽象類中,抽象方法和純虛擬函式區別

問題1 含有virtual修飾符的方法稱為虛擬方法。不能像你說的那樣定義。問題2 1 虛擬方專法,子屬類可以選擇性重寫此方法,也可以不重寫 而抽象 abstract 方法,子類必須重寫。2 虛擬方法可以有實體,如 public virtual void vt 所以,可以直接呼叫虛擬方法 而抽象方法不...

15關於純虛擬函式和抽象類的描述中,錯誤的是

c如果在派生類中沒有對純虛擬函式進行了定義,那這個派生類也是抽象類.不能用來定義物件 下述關於抽象類的描述中,錯誤的是?a.可以通過在類中定義純虛擬函式的方式定義抽象類 b.不可以建立 選c。建立類的引用,沒聽過,其他都對。選c,以下 編譯通過 class vclass int main 幾道c 選...