虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析
c++
虛函數(shù)
1.定義:在某基類(lèi)中聲明為 virtual 并在一個(gè)或多個(gè)派生類(lèi)中被重新定 義的成員函數(shù) [1]
2.語(yǔ)法:virtual 函數(shù)返回類(lèi)型 函數(shù)名(參數(shù)表) { 函數(shù)體 }
3.用途:實(shí)現(xiàn)多態(tài)性,通過(guò)指向派生類(lèi)的基類(lèi)指針,訪問(wèn)派生類(lèi)中同名覆蓋成員函數(shù),也就是允許子類(lèi)override父類(lèi)同名方法。
虛函數(shù)的作用是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,也就是在程序的運(yùn)行階段動(dòng)態(tài)地選擇合適的成員函數(shù),在定義了虛函數(shù)后,可以在基類(lèi)的派生類(lèi)中對(duì)虛函數(shù)重新定義,在派生類(lèi)中重新定義的函數(shù)應(yīng)與虛函數(shù)具有相同的形參個(gè)數(shù)和形參類(lèi)型(也就是完全相同的方法,不能只是函數(shù)名相同。)。以實(shí)現(xiàn)統(tǒng)一的接口,不同的定義過(guò)程。如果在派生類(lèi)中沒(méi)有對(duì)虛函數(shù)重新定義,則它繼承其基類(lèi)的虛函數(shù)。
當(dāng)程序發(fā)現(xiàn)虛函數(shù)名前的關(guān)鍵字virtual后,會(huì)自動(dòng)將其作為動(dòng)態(tài)聯(lián)編處理,即在程序運(yùn)行時(shí)動(dòng)態(tài)地選擇合適的成員函數(shù)。虛函數(shù)是C++多態(tài)的一種表現(xiàn)。動(dòng)態(tài)聯(lián)編規(guī)定,只能通過(guò)指向基類(lèi)的指針或基類(lèi)對(duì)象的引用來(lái)調(diào)用虛函數(shù),其格式:
1.指向基類(lèi)的指針變量名->虛函數(shù)名(實(shí)參表)
2.基類(lèi)對(duì)象的引用名. 虛函數(shù)名(實(shí)參表)
使用虛函數(shù),我們可以靈活的進(jìn)行動(dòng)態(tài)綁定,當(dāng)然是以一定的開(kāi)銷(xiāo)為代價(jià)。如果父類(lèi)的函數(shù)(方法)根本沒(méi)有必要或者無(wú)法實(shí)現(xiàn),完全要依賴子類(lèi)去實(shí)現(xiàn)的話,可以把此函數(shù)(方法)設(shè)為virtual 函數(shù)名=0 ,例如:virtual void fun() = 0,我們把這樣的函數(shù)(方法)稱為純虛函數(shù)。如果一個(gè)類(lèi)包含了純虛函數(shù),稱此類(lèi)為抽象類(lèi)。
總結(jié):如果一個(gè)子類(lèi)想要重寫(xiě)父類(lèi)的方法,那么父類(lèi)的這個(gè)成員方法必須是virtual的,也就是這個(gè)方法必須是虛函數(shù)。
java
在java中,所有方法默認(rèn)就是虛擬的,只要方法不是聲明為final類(lèi)型的,那么肯定就是虛函數(shù),不用為方法顯示聲明為virtual。在<core java2 :volum I>中提到:"In Java, you do not need to declare a method as virtual. Dynamic binding is the default behavior. If you do not want a method to be virtual, you tag it as final"。所以我們發(fā)現(xiàn),在java中,子類(lèi)可以重寫(xiě)(override)父類(lèi)的方法,而父類(lèi)沒(méi)有聲明virtual。
相關(guān)文章
基于C++ list中erase與remove函數(shù)的使用詳解
本篇文章是對(duì)C++ list中erase與remove函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Qt 數(shù)據(jù)庫(kù)QSqlDatabase使用示例
本文主要介紹了Qt數(shù)據(jù)庫(kù)QSqlDatabase使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
解決C語(yǔ)言輸入單個(gè)字符屏蔽回車(chē)符的問(wèn)題
這篇文章主要介紹了解決C語(yǔ)言輸入單個(gè)字符屏蔽回車(chē)符的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
C語(yǔ)言指針入門(mén)學(xué)習(xí)面面觀
這篇文章主要介紹了C語(yǔ)言指針的一些基礎(chǔ)知識(shí),指針可以說(shuō)是C語(yǔ)言入門(mén)學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下2016-02-02
C語(yǔ)言詳細(xì)講解#error與#line如何使用
這篇文章主要介紹了C語(yǔ)言中#error與#line如何使用,#error與#line雖然在語(yǔ)言里面用的比較少,但是還是有必要了解一下2022-04-04
OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法
這篇文章主要為大家詳細(xì)介紹了OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
利用C語(yǔ)言實(shí)現(xiàn)任務(wù)調(diào)度的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用純C語(yǔ)言實(shí)現(xiàn)任務(wù)調(diào)度(可用于STM32、C51等單片機(jī)),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04

