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

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

1樓:匿名使用者

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

問題來了,p2明明指向的是class b的物件但卻是呼叫的class a的print()函式,這不是我們所期望的結果,那麼解決這個問題就需要用到虛函式   class a //現在成了虛函式了   };   class b:public a //這裡需要在前面加上關鍵字virtual嗎?   };   毫無疑問,class a的成員函式print()已經成了虛函式,那麼class b的print()成了虛函式了嗎?

回答是yes,我們只需在把基類的成員函式設為virtual,其派生類的相應的函式也會自動變為虛函式。所以,class b的print()也成了虛函式。那麼對於在派生類的相應函式前是否需要用virtual關鍵字修飾,那就是你自己的問題了。

  現在重新執行main2的**,這樣輸出的結果就是this is a和this is b了。   現在來消化一下,我作個簡單的總結,指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。

2樓:匿名使用者

#include

#include

#include

class a

void print()

virtual void seta()

void setb()

};class b:public a

void setb()

};int main()

//想要了解virtual,就必須先了解類繼承中的一些概念//現在假設樓主已經了解了

//比如上面這個例子,a和b呼叫的都是a裡面的print()函式,但在程式執行在a的print()函式裡時,通過正常的手段是無法知道print()本身是不是a的繼承類呼叫的,於是此時virtual就派上了用處

//樓主執行一下上面的**,就知道virtual函式具體的呼叫方式了//至於抽象類在c++中是指含有純虛函式的類吧,它不能生成物件。

3樓:匿名使用者

虛函式就是宣告為 virtual的函式,空的虛函式沒有用,但是宣告了不定義,這個類就是抽象類,不能在程式中定義這個類的物件,不過可以宣告,比如提前宣告。

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

4樓:莫斯利安純牛奶

c++中虛函式的作用:

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

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

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

c++中虛函式的用法:

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

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

擴充套件資料:

使用虛函式的注意事項:

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

2、虛析構函式

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

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

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

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

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

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

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

5樓:木子青耶

虛函式的作用:

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

虛函式的使用方法是:

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

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

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

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

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

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

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

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

6樓:匿名使用者

c++中虛函式的作用:

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

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

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

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

c++中虛函式的用法:

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

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

7樓:匿名使用者

c++中虛函式的作用:

1、方便使用多型特性。

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

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

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

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

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

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

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

虛函式的使用方法是:

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

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

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

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

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

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

c++中虛函式,和抽象類到底是什麼意思

8樓:閱尊

虛函式來

在執行時具有多型性,若某源個基bai類函式宣告為虛函du數,那麼公有派生類將定義

zhi與基類虛函式原型相同dao的函式。(通俗說:基類函式加virtual成為虛函式後,在派生類裡將重新定義與基類虛函式原型相同的函式,當用基類指標或基類引用操作派生類物件時,系統將會呼叫派生類裡的同名函式!

)抽象類就是至少包含乙個純虛函式(只宣告函式不具體定義功能,在派生類中定義功能)的類是抽象類,抽象類只作為基類派生新類。抽象類作用是更有效發揮多型特性!

參考教材及個人見解,純手打,僅供參考,滿意請採納一下吧!

9樓:物理公司的

c++裡面虛函式,純虛方法(抽象類)具體怎麼理解?

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

文件類共創空間 虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include usin...

c 為什麼需要把重新定義的函式定義為虛擬函式

聚發稿網 1不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。如果派生類中有用new分配的記憶體,就...

csqrt用函式,C 中sqrt函式需要什麼標頭檔案

暗影之王 功 能 乙個非負實數的平方根 函式原型 在vc6.0中的math.h標頭檔案的函式原型為double sqrt double 說明 sqrt系square root calculations 平方根計算 通過這種運算可以考驗cpu的浮點能力。 include include using n...