在華為、中興等企業招聘筆試面試中曾經出現過這樣一道題目:什么函數不能聲明為虛函數?
該題答案為:普通函數(非成員函數)、靜態成員函數、內聯成員函數、構造函數、友元函數
該題考查的是虛函數聲明的相關概念。其解析如下:
虛函數通過繼承方式來體現出多態作用,它必須是基類的非靜態成員函數,其訪問權限可以是protected或public,在基類的類定義中定義虛函數的一般形式是:
virtual 函數返回值類型虛函數名(形參表){ 函數體 }
常見的不能聲明為虛函數的有:普通函數(非成員函數)、靜態成員函數、內聯成員函數、構造函數、友元函數。
(1)普通函數不能聲明為虛函數。普通函數(非成員函數)只能被重載(overload),不能被重寫(override),聲明為虛函數也沒有什么意思,因此編譯器會在編譯時綁定函數。
(2) 構造函數不能聲明為虛函數。構造函數一般用來初始化對象,只有在一個對象生成之后,才能發揮多態作用。如果將構造函數聲明為虛函數,則表現為在對象還沒有生成的時候來定義它的多態,這兩點是不統一的。另外,構造函數不能被繼承,因而不能聲明為虛函數。
(3) 靜態成員函數不能聲明為虛函數。靜態成員函數對于每個類來說只有一份代碼,所有的對象都共享這份代碼,它不歸某個對象所有,所以也沒有動態綁定的必要性。
(4) 內聯(inline)成員函數不能聲明為虛函數。內聯函數就是為了在代碼中直接展開,減少函數調用開銷的代價。虛函數是為了在繼承后對象能夠準確的執行自己的動作,這是不可能統一的。另外,內聯函數在編譯時被展開,虛函數在運行時才能動態的綁定函數。
(5) 友元函數不能聲明為虛函數。友元函數不屬于類的成員函數,不能被繼承。
設置虛函數時須注意以下幾點:
只有類的成員函數才能說明為虛函數;
靜態成員函數不能是虛函數;
內聯函數不能為虛函數;
構造函數不能是虛函數;
析構函數可以是虛函數,而且通常聲明為虛函數。
本文已收錄于《橫掃Offer--程序員招聘真題詳解700題》一書,開點工作室著,清華大學出版社。更多程序員筆試面試真題的精彩詳解請參見該書。
為保證書稿質量,作者及出版社在編寫完成后經過反復多次的審核、校對和修改,力求為讀者奉獻一本內容詳實、嚴謹、準確、精美的實用寶典,因此上市時間有所延后,望各位讀者諒解。該書目前已進入印刷環節,預計8月下旬各大網上書店開始發售。我們將會在第一時間通知該書的上市購買信息,并將舉行評論送書活動,以感謝各位讀者的支持。詳細情況請持續關注微信公眾賬號“開點工作室”。