1:java中沒有虛函數的概念,但是有抽象函數的概念,用abstract關鍵字表示,java中抽象函數必須在抽象類別中,而且抽象 函數不能有函數體,抽象類別不能被執行個體化,只能由其子類實現抽象函數,如果某個抽象類別的子類仍是抽象類別,那麼該子類不需要實現其父類的抽象函數。
2:C++中有虛函數的概念,用virtual 關鍵字來表示,每個類都會有一個虛函數表,該虛函數表首先會從父類中繼承得到父類的虛函數表, 如果子類中重寫了父類的虛函數(不管重寫後的函數是否為虛函數),要調用哪個虛函數,是根據當前實際的對象來判斷的(不管指標所屬類型是否為當前類,有可 能是父類型),指標當前指向的是哪種類型的對象,就調用哪個類型中類定義的虛函數。每個類只有一張虛擬函數表,所有的對象共用這張表。
C++的函數多態就是通過虛函數來實現的。
3:C++中,如果函數不是虛函數,則調用某個函數,是根據當前指標類型來判斷的,並不是根據指標所指向對象的類型。
4:Java中,如果函數不是抽象函數,而是一個普通函數,它是預設實作類別似C++中虛函數功能的,也就是說,調用某個函數,是根據當前指標所指向對象的類型來判斷的,而不是根據指標類型判斷。正好與C++中的普通函數相反。即:JAVA裡自動實現了虛函數。
C++ Java
虛函數 -------- 普通函數
純虛函數 -------- 抽象函數
抽象類別 -------- 抽象類別
虛基類 -------- 介面
純虛函數: 主要特徵是不能被用來聲明對象,是抽象類別,是用來確保程式結構與應用域的結構具有直接映射關係的設計工具。帶有純虛函數的類稱為抽象類別,抽象類別能被子類 繼承使用,在子類中必須給出純虛函數的實現,如果子類未給出該純虛函數的實現,那麼該子類也是抽象類別,只有在子類不存在純虛函數時,子類才可以用來聲明對 象!抽象類別也能用於聲明指標或引用,或用於函式宣告中。具有抽象類別特性的類還有建構函式和解構函式,全部是保護的類。如果沒有給出純虛函數的實現,則在它 所在的類的建構函式或解構函式中不能直接或間接的調用它。純虛函數的實現可以在類聲明外進行定義。
5. C++中一般都是把解構函式聲明為虛函數。因為虛函數可以實現動態綁定,也就是到底調用哪個函數是根據指標當前指向哪個對象來確定的,不是根據指標的類型來確定。如果C++中不把解構函式聲明為虛函數,那麼其有個子類,重寫了虛函數,那麼當父類指標指向一個子類對象時,當調用解構函式時,只調用父類的解構函式,而無法調用子類的解構函式,所以一般情況是把解構函式聲明為虛函數,實現動態綁定。當然如果一個類不包含虛函數,這經常預示不打算將它作為基類使用。當一個類不打算作為基類時,將解構函式聲明為虛擬通常是個壞主意。
標準 string 類型不包含虛函數,如果把String作為基類繼承得到子類會出問題。
總之:多態基類應該聲明虛解構函式。如果一個類有任何虛函數,它就應該有一個虛解構函式;如果不是設計用於做基類或不是設計用於多態,這樣的類就不應該聲明虛解構函式。