1. 程式人生 > >虛擬函式、純虛擬函式通俗解釋(C++,Java)

虛擬函式、純虛擬函式通俗解釋(C++,Java)

c++
虛擬函式
1.定義:在某基類中宣告為 virtual 並在一個或多個派生類中被重新定 義的成員函式 [1]
2.語法:virtual 函式返回型別 函式名(引數表) { 函式體 }
3.用途:實現多型性,通過指向派生類的基類指標,訪問派生類中同名覆蓋成員函式,也就是允許子類
override父類同名方法。
虛擬函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛擬函式後,可以在基類的派生類中對虛擬函式重新定義,在派生類中重新定義的函式應與虛擬函式具有相同的形參個數和形參型別(也就是完全相同的方法,不能只是函式名相同。)。以實現統一的介面,不同的定義過程。如果在派生類中沒有對虛擬函式重新定義,則它繼承其基類的虛擬函式。

當程式發現虛擬函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態地選擇合適的成員函式。虛擬函式是C++多型的一種表現。動態聯編規定,只能通過指向基類的指標或基類物件的引用來呼叫虛擬函式,其格式:
1.指向基類的指標變數名->虛擬函式名(實參表)
2.基類物件的引用名. 虛擬函式名(實參表)
使用虛擬函式,我們可以靈活的進行動態繫結,當然是以一定的開銷為代價。如果父類的函式(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函式(方法)設為virtual 函式名=0 ,例如:virtual void fun() = 0,我們把這樣的函式(方法)稱為純虛擬函式。如果一個類包含了純虛擬函式,稱此類為抽象類。
總結:

如果一個子類想要重寫父類的方法,那麼父類的這個成員方法必須是virtual的,也就是這個方法必須是虛擬函式。

java
在java中,所有方法預設就是虛擬的,只要方法不是宣告為final型別的,那麼肯定就是虛擬函式,不用為方法顯示宣告為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"。所以我們發現,在java中,子類可以重寫(override)父類的方法,而父類沒有宣告virtual。