在面試的時候被問到一個問題,既然虛函數(shù)可以不被重寫,為什么不把所有的函數(shù)都設置成虛函數(shù)?
我當時的回答是,因為對于工程來說,一個類里可能會有很多的函數(shù),都設置成虛函數(shù)的話會有很多不必要的開銷(虛函數(shù)表)。但總覺得回答不夠完善,所以閑下來去了解了一下這個問題:
1.有些函數(shù)不能設置成虛函數(shù),如:構造函數(shù)、內聯(lián)成員函數(shù)、靜態(tài)成員函數(shù)、友元函數(shù)、普通函數(shù)(非成員函數(shù)),他們各有其原因:
1)構造函數(shù):不能被繼承;構造函數(shù)時,函數(shù)還沒實例化,無法通過虛函數(shù)表指針尋找虛函數(shù);
2)內聯(lián)成員函數(shù):內聯(lián)要求在編譯時展開該函數(shù),而虛函數(shù)要求動態(tài)綁 定;
3)靜態(tài)成員函數(shù):靜態(tài)函數(shù)被類成員共享、只有一份且不可繼承;
4)友元函數(shù):不屬于成員函數(shù)、無法繼承;
5)普通函數(shù):不能被繼承、不能被重寫;編譯時已綁定;
(當然,我們也可以假定給這些函數(shù)強行virtual)文章來源:http://www.zghlxwxcb.cn/news/detail-411365.html
2.時間(定向)和空間(建立虛函數(shù)表)的無意義花費;
3.virtual這個關鍵字本身可以對程序員起到提醒的作用;文章來源地址http://www.zghlxwxcb.cn/news/detail-411365.html
到了這里,關于C++中為什么不能把所有函數(shù)都設置成虛函數(shù)?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!