c中函式覆蓋和使用虛函式有什麼區別

2021-04-19 01:29:43 字數 3614 閱讀 8009

1樓:逍遙俠

我覺得最明顯的復區別,給你制舉個例子。

有兩個類bai

du :父類 class 子類 student 同有乙個函式zhi名為 num的函式

父類物件

dao class 子類物件 student

那麼函式覆蓋就是 student.num(); //直接用子類物件呼叫了子類函式

而虛函式則是 class *pt;

pt=&student; pt->num(); //用父類指標物件呼叫子類函式

能大致明白嗎?函式覆蓋是在子類物件呼叫函式時(父類和子類的函式頭一樣)選擇了子類自己的函式,而不是呼叫繼承於父類的函式

而虛函式則是定義了父類的指標物件,而用它可以呼叫到子類物件的函式

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

2樓:月無痕

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

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

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

virtual void print() = 0;

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

virtual void print()

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

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

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

3樓:匿名使用者

這個區別很重要

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

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

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

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

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

例子:#include "stdafx.h"

#include

using namespace std;

class a

4樓:韓靚

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

c++中父類中含有乙個虛函式,那麼子類中對其進行覆蓋的話,是不是需要返回值型別也一定相同?

5樓:匿名使用者

要覆蓋乙個虛函式,那麼引數和返回值型別必須相同,否則不會覆蓋,只能過載!

6樓:匿名使用者

必須相同,否則在編譯時會報錯,指定了衝突的返回型別

c++ 中,類的繼承:父類當使用虛函式時候,子類對該函式進行重寫的話,屬於子類成員函式對虛函式的覆蓋!

7樓:匿名使用者

可以這麼理解。

換句話說,你呼叫子類的虛函式,程式會執行你重寫的**,而不是定義在父類裡的**。

8樓:wssz**x的春天

有沒有**,你這樣我也看不懂!

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

9樓:月無痕

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

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

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

virtual void print() = 0;

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

virtual void print()

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

c++:派生類中重定義基類的成員函式與虛函式區別在**?

10樓:匿名使用者

1、c++的虛函式主要是為了實現多型。基類定義的虛函式,派生類重新定義該函式,這樣基類物件指標呼叫哪乙個函式是判斷該基類指標的物件的型別。

2、虛函式用virtual關鍵字修飾,同時開啟動態聯編技術,動態聯編只有程式執行時才能確定呼叫的函式,在編譯階段是不知道要呼叫哪乙個函式。

11樓:匿名使用者

如果加關鍵字 virtual,則是 override;

如果不加關鍵字 virtual,則跟作用域有關,基類與派生類的成員函式作用域不相同。

什麼是c++虛函式,虛函式的作用和使用方法

12樓:何度千尋

在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

虛函式定義:簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性(polymorphi**),多型性是將介面與實現進行分離;用形象的語言來解釋就是實現以共同的方法,但因個體差異,而採用不同的策略。

虛函式的作用:用同乙個呼叫形式,既能呼叫派生類又能呼叫基類的同名函式。

虛函式的使用方法是:

在基類用virtual宣告成員函式為虛函式。

這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。在類外定義虛函式時,不必再加virtual。

在派生類中重新定義此函式,要求函式名、函式型別、函式引數個數和型別全部與基類的虛函式相同,並根據派生類的需要重新定義函式體。

c++規定,當乙個成員函式被宣告為虛函式後,其派生類中的同名函式都自動成為虛函式。因此在派生類重新宣告該虛函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。如果在派生類中沒有對基類的虛函式重新定義,則派生類簡單地繼承其直接基類的虛函式。

定義乙個指向基類物件的指標變數,並使它指向同一類族中需要呼叫該函式的物件。

通過該指標變數呼叫此虛函式,此時呼叫的就是指標變數指向的物件的同名函式。

通過虛函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。

13樓:匿名使用者

當乙個基類或虛基類派生了多個子類時,並且這些子類都重寫了基類的乙個虛函式,那麼當你建立了多個子類物件時,可以把這些物件組成乙個基類陣列,通過類基物件或基類物件指標可以呼叫同乙個函式名而執行的是不同的子類的函式,這就是虛函式最根本的用途,這是乙個後期繫結機制,在編譯前,物件的型別是不可知的。在編譯時才確定物件的型別,從而呼叫合適的函式。

class a

;class b : public a

;int main(int argc, char* argv)

關於c中虛函式過載的問題,C 中純虛函式能過載嗎?

在派生類重新定義或者覆寫基類的過載函式,會導致繼承的名稱被遮掩。在派生類的 public 區域增加 using base func 語句可以解決。你在derive類中的func也加上了virtual導致基類函式被覆蓋,所以肯定錯了 大家都說錯了,沒說到重點。這不是什麼虛函式限制,主要原因在於函式呼叫...

C建構函式和析構函式的使用問題

注意我和你有些地方寫法不太一樣,建構函式我一般喜歡這樣寫。include class carray float getfloat int index re取浮點陣列中第index個元素,index從0開始 carray 析構函式,釋放動態分配的記憶體空間void print 分別輸出整形陣列和浮點陣...

在c 中純虛函式和抽象類的具體用途是什麼,他們的區別是什麼

從名字bai上就能 看出來,純du虛函式是一種 函式 zhi 抽象類是一dao種版 類 函式和類,自權然是最大的區別。它們的用途是定義抽象的介面。純虛函式是指沒有具體實現的虛函式,乙個類包含了純虛函式就成為了抽象類,這樣的類不能被建立例項,所以可以作為抽象介面,由子類來定義純虛函式的具體實現。c 中...