Java中的抽象函數與C++中的虛函數

來源:互聯網
上載者:User

1:java中沒有虛函數的概念,但是有抽象函數的概念,用abstract關鍵字表示,java中抽象函數必須在抽象類別中,而且抽象 函數不能有函數體,抽象類別不能被執行個體化,只能由其子類實現抽象函數,如果某個抽象類別的子類仍是抽象類別,那麼該子類不需要實現其父類的抽象函數。

2:C++中有虛函數的概念,用virtual 關鍵字來表示,每個類都會有一個虛函數表,該虛函數表首先會從父類中繼承得到父類的虛函數表, 如果子類中重寫了父類的虛函數(不管重寫後的函數是否為虛函數),要調用哪個虛函數,是根據當前實際的對象來判斷的(不管指標所屬類型是否為當前類,有可 能是父類型),指標當前指向的是哪種類型的對象,就調用哪個類型中類定義的虛函數。每個類只有一張虛擬函數表,所有的對象共用這張表。

C++的函數多態就是通過虛函數來實現的。

3:C++中,如果函數不是虛函數,則調用某個函數,是根據當前指標類型來判斷的,並不是根據指標所指向對象的類型。

4:Java中,如果函數不是抽象函數,而是一個普通函數,它是預設實作類別似C++中虛函數功能的,也就是說,調用某個函數,是根據當前指標所指向對象的類型來判斷的,而不是根據指標類型判斷。正好與C++中的普通函數相反。即:JAVA裡自動實現了虛函數。

C++ Java
虛函數 -------- 普通函數
純虛函數 -------- 抽象函數
抽象類別 -------- 抽象類別
虛基類 -------- 介面

純虛函數: 主要特徵是不能被用來聲明對象,是抽象類別,是用來確保程式結構與應用域的結構具有直接映射關係的設計工具。帶有純虛函數的類稱為抽象類別,抽象類別能被子類 繼承使用,在子類中必須給出純虛函數的實現,如果子類未給出該純虛函數的實現,那麼該子類也是抽象類別,只有在子類不存在純虛函數時,子類才可以用來聲明對 象!抽象類別也能用於聲明指標或引用,或用於函式宣告中。具有抽象類別特性的類還有建構函式和解構函式,全部是保護的類。如果沒有給出純虛函數的實現,則在它 所在的類的建構函式或解構函式中不能直接或間接的調用它。純虛函數的實現可以在類聲明外進行定義。

5. C++中一般都是把解構函式聲明為虛函數。因為虛函數可以實現動態綁定,也就是到底調用哪個函數是根據指標當前指向哪個對象來確定的,不是根據指標的類型來確定。如果C++中不把解構函式聲明為虛函數,那麼其有個子類,重寫了虛函數,那麼當父類指標指向一個子類對象時,當調用解構函式時,只調用父類的解構函式,而無法調用子類的解構函式,所以一般情況是把解構函式聲明為虛函數,實現動態綁定。當然如果一個類不包含虛函數,這經常預示不打算將它作為基類使用。當一個類不打算作為基類時,將解構函式聲明為虛擬通常是個壞主意。
標準 string 類型不包含虛函數,如果把String作為基類繼承得到子類會出問題。
總之:多態基類應該聲明虛解構函式。如果一個類有任何虛函數,它就應該有一個虛解構函式;如果不是設計用於做基類或不是設計用於多態,這樣的類就不應該聲明虛解構函式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.