虛擬函式virtual的作用,C 中虛擬函式的作用是什麼?它應該怎麼用呢?

時間 2021-08-30 10:08:09

1樓:文件類共創空間

虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

例:基類與派生類中有同名函式。

在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。

#include

#include

using namespace std;

//宣告基類student

class student

;//student類成員函式的實現

student::student(int n, string nam,float s) //定義建構函式

void student::display( ) //定義輸出函式

執行結果如下,請仔細分析。

num:1001(stud1的資料)

name:li

score:87.5

num:2001 (grad1中基類部分的資料)

name:wang

score:98.5

下面對程式作一點修改,在student類中宣告display函式時,在最左面加一個關鍵字virtual,即

virtual void display( );

這樣就把student類的display函式宣告為虛擬函式。程式其他部分都不改動。再編譯和執行程式,請注意分析執行結果:

num:1001(stud1的資料)

name:li

score:87.5

num:2001 (grad1中基類部分的資料)

name:wang

score:98.5

pay=1200 (這一項以前是沒有的)

由虛擬函式實現的動態多型性就是: 同一類族中不同類的物件,對同一函式呼叫作出不同的響應。虛擬函式的使用方法是:

(1) 在基類用virtual宣告成員函式為虛擬函式。這樣就可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。

在類外定義虛擬函式時,不必再加virtual。

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

c++規定,當一個成員函式被宣告為虛擬函式後,其派生類中的同名函式都自動成為虛擬函式。因此在派生類重新宣告該虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。

如果在派生類中沒有對基類的虛擬函式重新定義,則派生類簡單地繼承其直接基類的虛擬函式。

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

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

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

需要說明;有時在基類中定義的非虛擬函式會在派生類中被重新定義,如果用基類指標呼叫該成員函式,則系統會呼叫物件中基類部分的成員函式;如果用派生類指標呼叫該成員函式,則系統會呼叫派生類物件中的成員函式,這並不是多型性行為(使用的是不同型別的指標),沒有用到虛擬函式的功能。

以前介紹的函式過載處理的是同一層次上的同名函式問題,而虛擬函式處理的是不同派生層次上的同名函式問題,前者是橫向過載,後者可以理解為縱向過載。但與過載不同的是: 同一類族的虛擬函式的首部是相同的,而函式過載時函式的首部是不同的(引數個數或型別不同)。

2樓:匿名使用者

虛擬函式的作用在於執行的時候能夠正確的識別呼叫函式的物件是那個類的,然後正確的呼叫對應的函式

如果物件是基類的物件,呼叫的就是基類的函式,如果物件是派生類的,就呼叫派生類的同名函式

class base

};class d1 : public base};class d2 : public base};int main()

c++中虛擬函式的作用是什麼?它應該怎麼用呢?

3樓:莫斯利安純牛奶

c++中虛擬函式的作用:

1、簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式。

2、實現多型性,多型性是將介面與實現進行分離。

3、當基類指標指向一個子類物件,通過這個指標呼叫子類和基類同名成員函式的時候,基類宣告為虛擬函式就會調子類的這個函式,不宣告就會呼叫基類的。

c++中虛擬函式的用法:

1、比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。

2、派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。

擴充套件資料:

使用虛擬函式的注意事項:

1、包含虛擬函式的類指標列表會增大。

2、虛解構函式

(1)解構函式的作用是在物件撤銷之前做必要的“清理現場”的工作。

(2)當派生類的物件從記憶體中撤銷的時候,會先先呼叫派生類的解構函式然後再呼叫基類的解構函式。

(3)當我們new一個臨時物件時,若基類中包含解構函式,並且定義了一個指向該基類的指標變數。

3、建構函式不能宣告為虛擬函式

建構函式不能宣告為虛擬函式。如果宣告為虛擬函式,編譯器會自動報出。

4、不在析構或者構造過程中呼叫虛擬函式

在解構函式或者是建構函式中,我們絕對不能呼叫虛擬函式。即使,我們在建構函式或者解構函式中呼叫虛擬函式,也不會下降至派生類中呼叫函式。

4樓:木子青耶

虛擬函式的作用:

允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

虛擬函式的使用方法是:

1.在基類用virtual宣告成員函式為虛擬函式可以在派生類中重新定義此函式,為它賦予新的功能,並能方便地被呼叫。

在類外定義虛擬函式時,不必再加virtual。

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

在派生類重新宣告該虛擬函式時,可以加virtual,也可以不加,但習慣上一般在每一層宣告該函式時都加virtual,使程式更加清晰。

3.如果在派生類中沒有對基類的虛擬函式重新定義,則派生類簡單地繼承其直接基類的虛擬函式。

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

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

虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。

5樓:匿名使用者

c++中虛擬函式的作用:

1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。

同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。

c++中虛擬函式的用法:

比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。然後派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。

然後出現好多怪物的時候就可以定義一個 虛基類指標陣列,把各種怪物的指標給它,然後迭代迴圈的時候直接 monster[i]->attack() 攻擊玩家就行了,大概見下圖:

6樓:匿名使用者

c++中虛擬函式的作用:

1、方便使用多型特性。

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。

這樣就很好地解決了上述兩個問題。

宣告瞭純虛擬函式的類是一個抽象類。所以,使用者不能建立類的例項,只能建立它的派生類的例項。

純虛擬函式最顯著的特徵是:它們必須在繼承類中重新宣告函式(不要後面的=0,否則該派生類也不能例項化),而且它們在抽象類中往往沒有定義。

定義純虛擬函式的目的在於,使派生類僅僅只是繼承函式的介面。

3、純虛擬函式的意義,讓所有的類物件(主要是派生類物件)都可以執行純虛擬函式的動作,但類無法為純虛擬函式提供一個合理的預設實現。所以類純虛擬函式的宣告就是在告訴子類的設計者,“你必須提供一個純虛擬函式的實現,但我不知道你會怎樣實現它”。

虛擬函式的使用方法是:

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

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

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

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

4、通過該指標變數呼叫此虛擬函式,此時呼叫的就是指標變數指向的物件的同名函式。通過虛擬函式與指向基類物件的指標變數的配合使用,就能方便地呼叫同一類族中不同類的同名函式,只要先用基類指標指向即可。

如果指標不斷地指向同一類族中不同類的物件,就能不斷地呼叫這些物件中的同名函式。這就如同前面說的,不斷地告訴計程車司機要去的目的地,然後司機把你送到你要去的地方。

c 中什麼是虛函式?空虛函式有什麼作用?可以宣告抽象類的對

簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來解釋就是實現多型性 polymorphism 多型性是將介面與實現進行分離 用形象的語言來解釋就是實現以共同的方法,但因個體差異而採用不同的策略。下面來看一段簡單的 class a 執行一下看看結果,喲呵,驀然...

C虛方法的作用,c 中,虛方法的特點是什麼?

他的子類可以重寫也可以不重寫,實現多型 c 中的虛方法究竟有什麼用了 這個區別可就大了。從類這種機制看,你覆蓋是把東西換了,對於這個類來說,以前的方法不存在了。重寫是你在這個類的虛擬函式表 不清楚自己查下 裡增加了一項,並沒有覆蓋,是一種動態性的調整。例子,類a和類b的繼承關係是類b繼承類a,然後有...

C 中c str 函式是什麼作用CC

c str函式的返回值是const char 的,不能直接賦值給char 所以就需要我們進行相應的操作轉化,下面就是這一轉化過程。c 語言提供了兩種字串實現,其中較原始的一種只是字串的c語言實現。與c語言的其他部分一樣,它在c 的所有實現中可用,我們將這種實現提供的字串物件,歸為c 串,每個c 串c...