虛函式有什麼特點,虛函式和抽象函式有什麼區別?

2021-03-04 05:44:46 字數 3724 閱讀 9330

1樓:

定義虛函式必須是基類的非靜態成員函式,其訪問許可權可以是protected或public,在基類的類定義中定義虛函式的一般形式: virtual 函式返回值型別 虛函式名(形參表)

編輯本段作用

虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。

當程式發現虛函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態地選擇合適的成員函式。 ([2010.10.

28] 注:下行語義容易使人產生理解上的偏差,實際效果應為: 如存在:

base -> derive1 -> derive2 及它們所擁有的虛函式func() 則在訪問派生類derive1的例項時,使用其基類base及本身型別derive1,或被靜態轉換的後續派生類derive2的指標或引用,均可訪問到derive1所實現的func()。) 動態聯編規定,只能通過指向基類的指標或基類物件的引用來呼叫虛函式,其格式: 指向基類的指標變數名->虛函式名(實參表) 或 基類物件的引用名.

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

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

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

2樓:

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

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

供參考……

3樓:匿名使用者

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

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

4樓:許詩文

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

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

在乙個類中用虛函式:

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

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

在乙個類中用抽象函式

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

抽象函式沒有方法體。

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

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

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

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

5樓:匿名使用者

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

class <類名>

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

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

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

c++虛函式與普通成員函式究竟有什麼本質上的區別?

6樓:匿名使用者

這個區別很重要

在抽象的繼承模型中叫做多型

就是說,你定義乙個類,他們具有相同的介面

但是具體的不同的類又有不同的特徵,實現之類可能也完全不同但是你可以用共同的基類指標來管理

虛函式在實現的時候,其實是在類裡建了乙個隱含的成員變數,是乙個指向函式的指標

所以從基類呼叫也可以呼叫到繼承類定義的成員函式。

例子:#include "stdafx.h"

#include

using namespace std;

class a

7樓:韓靚

c++的虛函式主要是為了實現多型。基類定義的虛函式,派生類重新定義該函式,這樣基類物件指標呼叫哪乙個函式是判斷該基類指標的物件的型別。虛函式用virtual關鍵字修飾,同時開啟動態聯編技術,動態聯編只有程式執行時才能確定呼叫的函式,在編譯階段是不知道要呼叫哪乙個函式。

c++中的虛函式有什麼作用?

8樓:

類的三個重要特徵:封裝、繼承、多型性。

其中多型性就是通過函式過載(運算子過載實質上也是函式過載)和虛函式來實現的。

虛函式的作用:在基類用virtual宣告成員函式為虛函式,在派生類中重新定義該函式,就可以通過基類指標或引用來訪問基類和派生類中的同名函式。

虛函式實現多型性:同一類族中不同類的物件,對同一函式呼叫做出不同的響應。

多型性其實就是乙個介面,多種方法,分為靜態多型性和動態多型性,函式過載屬於靜態多型性,在程式編譯時就可確定呼叫哪個函式,其過程稱為靜態關聯或早期關聯,靜態多型性又稱編譯時多型性;虛函式屬於動態多型性,在程式執行過程中才動態地確定所呼叫的是那個物件的函式,其過程稱為動態關聯或滯後關聯,動態多型性又稱執行時多型性。

9樓:天蠍神經俠侶

指標的型別是可以強行轉

來轉去的。普通情況你轉什麼型別就調對應型別的同名函式。但是虛函式實現多型後,儘管可能你把指標轉成父類的型別,但是因為建立的時候是子類的型別,它還是會呼叫子類的這個虛函式。

這樣可以統一**且正確運用子類的新特性。

也因為如此,如果父類虛函式不做實現而=0成為純虛函式,那麼父類就不可以例項化,這個沒有實現的虛函式也永遠不會呼叫。因為根據多型的動態聯編,總是會呼叫例項化了的子類的該方法。指標強行轉成父類也不會呼叫純虛函式。

10樓:匿名使用者

virtual 關鍵詞可以將乙個類的函式

說明為虛函式

虛函式的主要用處是對派生類實現動態聯編.舉例說明一下:

class a

}class b:public a

}void main()

由上面簡單的例子可知,乙個基類的指標可以指向他的子類,使用該指標呼叫函式時,如果呼叫的函式在基類中被說明為虛函式,那麼子類中該函式也自動成為虛函式,呼叫時會根據指標所指向的物件呼叫相應類的虛函式.實現動態聯編.

更詳細的說明你可以看一下虛函式表

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

包含純虛函式的類不可以例項化。c 中 虛函式與純虛函式的區別是什麼?虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否...

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

虛函式與純虛函式 在他們的子類中都可以被重寫。它們的區別是 1 純虛函式只有定義,沒有實現 而虛函式既有定義,也有實現的 純虛函式一般沒有 實現部分,如 virtual void print 0 而一般虛函式必須要有 的實現部分,否則會出現函式未定義的錯誤。virtual void print 2 ...

sizeof計算虛函式和虛擬繼承類大小時的問題

這的確涉及了記憶體對齊,還有虛繼承vbptr指標,但是太複雜了,樓主弄明白了告訴我一聲。虛函式和虛繼承的大小問題 乙個簡單程式 我用的vc6,結果分別是8,20,32.a的大小為8的原因是位元組對齊,即虛函式表指標佔4位元組,k佔3位元組,然後編譯器補了1位元組,將類的大小湊成4的倍數,以方便32位...