華為面試題:什么函數不能聲明為虛函數

在華為、中興等企業招聘筆試面試中曾經出現過這樣一道題目:什么函數不能聲明為虛函數?

該題答案為:普通函數(非成員函數)、靜態成員函數、內聯成員函數、構造函數、友元函數

該題考查的是虛函數聲明的相關概念。其解析如下:

虛函數通過繼承方式來體現出多態作用,它必須是基類的非靜態成員函數,其訪問權限可以是protected或public,在基類的類定義中定義虛函數的一般形式是:

virtual 函數返回值類型虛函數名(形參表){ 函數體 }

常見的不能聲明為虛函數的有:普通函數(非成員函數)、靜態成員函數、內聯成員函數、構造函數、友元函數。

(1)普通函數不能聲明為虛函數。普通函數(非成員函數)只能被重載(overload),不能被重寫(override),聲明為虛函數也沒有什么意思,因此編譯器會在編譯時綁定函數。

(2) 構造函數不能聲明為虛函數。構造函數一般用來初始化對象,只有在一個對象生成之后,才能發揮多態作用。如果將構造函數聲明為虛函數,則表現為在對象還沒有生成的時候來定義它的多態,這兩點是不統一的。另外,構造函數不能被繼承,因而不能聲明為虛函數。

(3) 靜態成員函數不能聲明為虛函數。靜態成員函數對于每個類來說只有一份代碼,所有的對象都共享這份代碼,它不歸某個對象所有,所以也沒有動態綁定的必要性。

(4) 內聯(inline)成員函數不能聲明為虛函數。內聯函數就是為了在代碼中直接展開,減少函數調用開銷的代價。虛函數是為了在繼承后對象能夠準確的執行自己的動作,這是不可能統一的。另外,內聯函數在編譯時被展開,虛函數在運行時才能動態的綁定函數。

(5) 友元函數不能聲明為虛函數。友元函數不屬于類的成員函數,不能被繼承。

設置虛函數時須注意以下幾點:

只有類的成員函數才能說明為虛函數;

靜態成員函數不能是虛函數;

內聯函數不能為虛函數;

構造函數不能是虛函數;

析構函數可以是虛函數,而且通常聲明為虛函數。

本文已收錄于《橫掃Offer--程序員招聘真題詳解700題》一書,開點工作室著,清華大學出版社。更多程序員筆試面試真題的精彩詳解請參見該書。

為保證書稿質量,作者及出版社在編寫完成后經過反復多次的審核、校對和修改,力求為讀者奉獻一本內容詳實、嚴謹、準確、精美的實用寶典,因此上市時間有所延后,望各位讀者諒解。該書目前已進入印刷環節,預計8月下旬各大網上書店開始發售。我們將會在第一時間通知該書的上市購買信息,并將舉行評論送書活動,以感謝各位讀者的支持。詳細情況請持續關注微信公眾賬號“開點工作室”。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區別? C沒有Protection行為...
    阿面a閱讀 7,706評論 0 10
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • 1. 結構體和共同體的區別。 定義: 結構體struct:把不同類型的數據組合成一個整體,自定義類型。共同體uni...
    breakfy閱讀 2,138評論 0 22
  • struct與class的區別 C的struct與C++的class的區別:struct只是作為一種復雜數據類型定...
    geekzph閱讀 1,604評論 0 4
  • 1.面向對象的程序設計思想是什么? 答:把數據結構和對數據結構進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,031評論 0 14