2 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
虛函數(shù)的作用:
允許在派生類中重新定義與基類同名的函數(shù),并且可以通過(guò)基類指針或引用來(lái)訪問(wèn)基類和派生類中的同名函數(shù)。
虛函數(shù)的使用方法是:
1.在基類用virtual聲明成員函數(shù)為虛函數(shù)可以在派生類中重新定義此函數(shù),為它賦予新的功能,并能方便地被調(diào)用。
在類外定義虛函數(shù)時(shí),不必再加virtual。
2.在派生類中重新定義此函數(shù),要求函數(shù)名、函數(shù)類型、函數(shù)參數(shù)個(gè)數(shù)和類型全部與基類的虛函數(shù)相同,并根據(jù)派生類的需要重新定義函數(shù)體。
在派生類重新聲明該虛函數(shù)時(shí),可以加virtual,也可以不加,但習(xí)慣上一般在每一層聲明該函數(shù)時(shí)都加virtual,使程序更加清晰。
3.如果在派生類中沒(méi)有對(duì)基類的虛函數(shù)重新定義,則派生類簡(jiǎn)單地繼承其直接基類的虛函數(shù)。
4.定義一個(gè)指向基類對(duì)象的指針變量,并使它指向同一類族中需要調(diào)用該函數(shù)的對(duì)象。
通過(guò)該指針變量調(diào)用此虛函數(shù),此時(shí)調(diào)用的就是指針變量指向的對(duì)象的同名函數(shù);
虛函數(shù)與指向基類對(duì)象的指針變量的配合使用,就能方便地調(diào)用同一類族中不同類的同名函數(shù),只要先用基類指針指向即可。
擴(kuò)展資料:
C++中虛函數(shù)的總結(jié)
1、如果期望派生類重新定義一個(gè)成員函數(shù),應(yīng)該在基類中把此函數(shù)設(shè)為virtual。
2.以一個(gè)單一指令調(diào)用不同函數(shù),這種性質(zhì)成為多態(tài)(polymorphism);
虛擬函數(shù)是C++語(yǔ)言的多態(tài)性質(zhì)以及動(dòng)態(tài)綁定的關(guān)鍵。
3.抽象類中的虛函數(shù)不打算被調(diào)用,不應(yīng)該定義它,應(yīng)該把它設(shè)置為純虛函數(shù)(在函數(shù)聲明之后加上'=0'即可);
擁有純虛函數(shù)者為抽象類,以別于所謂的具體類;
抽象類不能產(chǎn)出對(duì)象實(shí)例,但是我們可以擁有指向抽象類的指針,以便于操作抽象類中的各個(gè)派生類。
4.虛函數(shù)派生下去仍為虛函數(shù),而且可以省略virtual關(guān)鍵字。

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
C++中虛函數(shù)的作用:
1、為了方便使用多態(tài)特性,我們常常需要在基類中定義虛擬函數(shù)。
2、在很多情況下,基類本身生成對(duì)象是不合情理的。例如,動(dòng)物作為一個(gè)基類可以派生出老虎、孔雀等子類,但動(dòng)物本身生成對(duì)象明顯不合常理。
為了解決上述問(wèn)題,引入了純虛函數(shù)的概念,將函數(shù)定義為純虛函數(shù)(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以重寫以實(shí)現(xiàn)多態(tài)性。
同時(shí)含有純虛擬函數(shù)的類稱為抽象類,它不能生成對(duì)象。這樣就很好地解決了上述兩個(gè)問(wèn)題。
C++中虛函數(shù)的用法:
比如你有個(gè)游戲,游戲里有個(gè)虛基類叫「怪物」,有純虛函數(shù) 「攻擊」。然后派生出了三個(gè)子類「狼」「蜘蛛」「蟒蛇」,都實(shí)現(xiàn)了自己不同的「攻擊」函數(shù),比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來(lái)。
然后出現(xiàn)好多怪物的時(shí)候就可以定義一個(gè) 虛基類指針數(shù)組,把各種怪物的指針給它,然后迭代循環(huán)的時(shí)候直接 monster[i]->attack() 攻擊玩家就行了,大概見(jiàn)下圖:
擴(kuò)展資料:
使用虛函數(shù)的注意事項(xiàng):
一、包含虛函數(shù)的類指針列表會(huì)增大。
二、虛析構(gòu)函數(shù)
析構(gòu)函數(shù)的作用是在對(duì)象撤銷之前做必要的“清理現(xiàn)場(chǎng)”的工作。當(dāng)派生類的對(duì)象從內(nèi)存中撤銷的時(shí)候,會(huì)先先調(diào)用派生類的析構(gòu)函數(shù)然后再調(diào)用基類的析構(gòu)函數(shù)。
當(dāng)我們new一個(gè)臨時(shí)對(duì)象時(shí),若基類中包含析構(gòu)函數(shù),并且定義了一個(gè)指向該基類的指針變量。
三、構(gòu)造函數(shù)不能聲明為虛函數(shù)
構(gòu)造函數(shù)不能聲明為虛函數(shù)。如果聲明為虛函數(shù),編譯器會(huì)自動(dòng)報(bào)出。
四、不在析構(gòu)或者構(gòu)造過(guò)程中調(diào)用虛函數(shù)
在析構(gòu)函數(shù)或者是構(gòu)造函數(shù)中,我們絕對(duì)不能調(diào)用虛函數(shù)。即使,我們?cè)跇?gòu)造函數(shù)或者析構(gòu)函數(shù)中調(diào)用虛函數(shù),也不會(huì)下降至派生類中調(diào)用函數(shù)。
- 2 回答
- 0 關(guān)注
- 602 瀏覽
添加回答
舉報(bào)