1樓:匿名使用者
首先你要稍微有點繼承和多型的概念。
虛擬函式是實現多型的基礎,舉個最俗的例子:
比如你有一個要實現畫圖的程式,需要畫線、圓、方塊等等,每種圖形不止一個,那麼這些類都有一個函式叫做draw()。
如果沒有多型的概念,那麼這些圖形就要儲存不同的集合裡,比如這裡在繪製邏輯裡需要一個list一個list一個list,然後每次繪製的時候分別去遍歷他們。這裡勢必會造成資源的浪費,以及難以擴充套件:比如我再加一個三角形,一個橢圓都要修改繪製邏輯。
如果引入多型的概念,那麼這些圖形可以繼承自一個類比如說shape,而他有個draw函式,那麼所有繼承自shape的物件都可以向上轉型到shape,繪製邏輯就可以只維護一個list<*shape>。
有了這個背景,接下來是你的問題。
虛擬函式:
那麼問題是怎麼保證轉型到shape的物件呼叫的draw函式是他們原來自己的draw函式呢?c++用虛擬函式宣告這個函式可以被子類過載。shape的draw函式如果不宣告為virtual,那麼對list<*shape>裡面的每一個物件呼叫的時候都是使用的shape的draw函式,這不是我們想看到的。
所以如果這個函式需要被子類(線啊圓啊這些類)覆蓋,那麼請使用virtual關鍵字。
純虛擬函式和抽象類:
上面有兄弟提到了,virtual void draw() = 0;這樣沒有函式體的函式是純虛擬函式,也就是說這個類的功能還不完整,那麼他就不能被例項化,就是不能new。那麼在我們的例子裡shape本身是沒有意義的,他只是為子類提供一個可重寫的方法,那麼這個shape類是不應該被例項化的,這個類的draw函式也不應該被實現(他不需要draw他也不知道自己該怎麼draw),draw這個方法可以定義為純虛擬函式,這個類自然就是抽象類了。
囉嗦了點額。。舉個例子比較容易理解。。
2樓:美麗生靈
虛擬函式必須要在繼承關係的類中才能體現出價值,在基類中如果用virtual修飾的函式,那麼在這個基類的派生類中重寫這個函式,則使用基類的指標指向派生型別時,呼叫的這個函式就是派生類自己定義的函式,舉例說明下:
class base
這時雖然p的型別是base型別的指標,但是指向的是一個base的派生類物件,那麼用這個指標呼叫虛擬函式時,就會體現c++的多型特性,實際呼叫的是child的show函式。
純虛擬函式就是當定義一個虛擬函式時,給它賦0,像上面那個這樣,virtual void show()= 0;這樣的話表示這個虛擬函式只能由派生類來實現,所以此時在主函式中寫base b();就會出現編譯錯誤,因為show函式在base類中不能被實現,當然也就不能定義base型別了
抽象類就是帶有純虛擬函式的類
3樓:匿名使用者
虛擬函式:就是指定義時加了個virtul 修飾,編繹是不存在的,主要是為了給他的孩子用的(就像你從你爸繼承到的錢一樣,可以給你用,但是並無法使來吃、喝、玩,只能通過間接的手段來獲得)如給孩子繼承後由孩子來決定如何使用,所以用起來更靈活(如你爸把給你的錢買了某樣東西,你就無法更改其功能了,但是給你錢就可以買你想要的東西)----注意,虛擬函式裡面可以有一定功能
純虛擬函式就是純屬什麼都沒有,就只是個名字罷了
如果類至少有一個純虛擬函式,則這個類就是抽象的 功能如虛擬函式說的,給孩子繼承用的
4樓:
樓上將的太麻煩了!
我用自己的話說一次吧
1:虛擬函式
虛擬函式是可以被子類重寫的函式.
virtual void testfun1();
2:純虛擬函式
純虛擬函式是一定要被子類實現的函式.
virtual void testfun1() = 0;
3:抽象類
有純虛擬函式的類叫抽象類,抽象類不能直接例項化,必須要被繼承並實現純虛擬函式後才能使用.
class ca;
求高手幫我講解下C語言中的while迴圈
的確是輸入快取裡面有回車的緣故,那樣就相當於你輸入了兩次,因而輸出連詞錯誤,i也沒減到了1,所以第二次無法輸入。你可已在 printf 錯誤 n 除一樓說的方法外後面寫上fflush stdin 清空輸入快取也可以達到目的 include include void main if a b else ...
高分請C 高手幫忙解下面兩道題,不勝感激要除錯成
第一個 include include include include using namespace std using std string int main if outfile string temp while getline infile,temp infile.close outfil...
50分求救c 幾個小問題?高手來幫忙
1,漢字佔兩個位元組,英文佔一個位元組。漢字在編碼中是負數,英文是正數。我舉個例子 char zifu 2 裡面可以存放一個漢字或者兩個字母if zifu 0 0 cout 字母 else if zifu 0 0 zifu 1 0 cout 漢字 2,這是我寫的,用法如下 revstr str co...