在華為、中興等企業(yè)招聘筆試面試中曾經(jīng)出現(xiàn)過這樣一道題目:什么函數(shù)不能聲明為虛函數(shù)梢夯?
該題答案為:普通函數(shù)(非成員函數(shù))、靜態(tài)成員函數(shù)晴圾、內(nèi)聯(lián)成員函數(shù)颂砸、構(gòu)造函數(shù)、友元函數(shù)
該題考查的是虛函數(shù)聲明的相關(guān)概念。其解析如下:
虛函數(shù)通過繼承方式來體現(xiàn)出多態(tài)作用人乓,它必須是基類的非靜態(tài)成員函數(shù)勤篮,其訪問權(quán)限可以是protected或public,在基類的類定義中定義虛函數(shù)的一般形式是:
virtual 函數(shù)返回值類型虛函數(shù)名(形參表){ 函數(shù)體 }
常見的不能聲明為虛函數(shù)的有:普通函數(shù)(非成員函數(shù))色罚、靜態(tài)成員函數(shù)碰缔、內(nèi)聯(lián)成員函數(shù)、構(gòu)造函數(shù)戳护、友元函數(shù)金抡。
(1)普通函數(shù)不能聲明為虛函數(shù)。普通函數(shù)(非成員函數(shù))只能被重載(overload)腌且,不能被重寫(override)梗肝,聲明為虛函數(shù)也沒有什么意思,因此編譯器會在編譯時綁定函數(shù)切蟋。
(2) 構(gòu)造函數(shù)不能聲明為虛函數(shù)统捶。構(gòu)造函數(shù)一般用來初始化對象,只有在一個對象生成之后柄粹,才能發(fā)揮多態(tài)作用喘鸟。如果將構(gòu)造函數(shù)聲明為虛函數(shù),則表現(xiàn)為在對象還沒有生成的時候來定義它的多態(tài)驻右,這兩點(diǎn)是不統(tǒng)一的什黑。另外,構(gòu)造函數(shù)不能被繼承堪夭,因而不能聲明為虛函數(shù)愕把。
(3) 靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。靜態(tài)成員函數(shù)對于每個類來說只有一份代碼森爽,所有的對象都共享這份代碼恨豁,它不歸某個對象所有,所以也沒有動態(tài)綁定的必要性爬迟。
(4) 內(nèi)聯(lián)(inline)成員函數(shù)不能聲明為虛函數(shù)橘蜜。內(nèi)聯(lián)函數(shù)就是為了在代碼中直接展開,減少函數(shù)調(diào)用開銷的代價付呕。虛函數(shù)是為了在繼承后對象能夠準(zhǔn)確的執(zhí)行自己的動作计福,這是不可能統(tǒng)一的。另外徽职,內(nèi)聯(lián)函數(shù)在編譯時被展開象颖,虛函數(shù)在運(yùn)行時才能動態(tài)的綁定函數(shù)。
(5) 友元函數(shù)不能聲明為虛函數(shù)姆钉。友元函數(shù)不屬于類的成員函數(shù)说订,不能被繼承抄瓦。
設(shè)置虛函數(shù)時須注意以下幾點(diǎn):
只有類的成員函數(shù)才能說明為虛函數(shù);
靜態(tài)成員函數(shù)不能是虛函數(shù)克蚂;
內(nèi)聯(lián)函數(shù)不能為虛函數(shù)闺鲸;
構(gòu)造函數(shù)不能是虛函數(shù);
析構(gòu)函數(shù)可以是虛函數(shù)埃叭,而且通常聲明為虛函數(shù)摸恍。
本文已收錄于《橫掃Offer--程序員招聘真題詳解700題》一書,開點(diǎn)工作室著赤屋,清華大學(xué)出版社立镶。更多程序員筆試面試真題的精彩詳解請參見該書。
為保證書稿質(zhì)量类早,作者及出版社在編寫完成后經(jīng)過反復(fù)多次的審核媚媒、校對和修改,力求為讀者奉獻(xiàn)一本內(nèi)容詳實(shí)涩僻、嚴(yán)謹(jǐn)缭召、準(zhǔn)確、精美的實(shí)用寶典逆日,因此上市時間有所延后嵌巷,望各位讀者諒解。該書目前已進(jìn)入印刷環(huán)節(jié)室抽,預(yù)計(jì)8月下旬各大網(wǎng)上書店開始發(fā)售搪哪。我們將會在第一時間通知該書的上市購買信息,并將舉行評論送書活動坪圾,以感謝各位讀者的支持晓折。詳細(xì)情況請持續(xù)關(guān)注微信公眾賬號“開點(diǎn)工作室”。