c++中不能被申明為虛擬函式的函式
常見的不不能宣告為虛擬函式的有:普通函式(非成員函式);靜態成員函式;內聯成員函式;建構函式;友元函式。
1.為什麼C++不支援普通函式為虛擬函式?
普通函式(非成員函式)只能被overload,不能被override,宣告為虛擬函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。
多型的執行期行為體現在虛擬函式上,虛擬函式通過繼承方式來體現出多型作用,頂層
函式不屬於成員函式,是不能被繼承的2.為什麼C++不支援建構函式為虛擬函式?
這個原因很簡單,主要是從語義上考慮,所以不支援。因為建構函式本來就是為了明確初始化物件成員才產生的,然而virtual function主要是為了再不完全瞭解細節的情況下也能正確處理物件。另外,
1)建構函式不能被繼承,因而不能宣告為virtual函式
(2)建構函式一般是用來初始化物件,只有在一個物件生成之後,才能發揮多型
作用,如果將建構函式宣告為virtual函式,則表現為在物件還沒有生成的情
況下酒使用了多型機制,因而是行不通的。
3.為什麼C++不支援內聯成員函式為虛擬函式?
其實很簡單,那行內函數就是為了在程式碼中直接展開,減少函式呼叫花費的代價,虛擬函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。(再說了,inline
inline函式和virtual函式有著本質的區別,inline函式是在程式被編譯時就展開,在函式呼叫處用整個函式體去替換,而virtual函式是在執行期才能夠確定如何去呼叫的,因而inline函式體現的是一種編譯期機制,virtual函式體現的是一種執行期機制。此外,一切virtual函式都不可能是inline函式。
4.為什麼C++不支援靜態成員函式為虛擬函式?
這也很簡單,靜態成員函式對於每個類來說只有一份程式碼,所有的物件都共享這一份程式碼,他也沒有要動態邦定的必要性。不能被繼承,只屬於該類。
5.為什麼C++不支援友元函式為虛擬函式?
因為C++不支援友元函式的繼承,對於沒有繼承特性的函式沒有虛擬函式的說法。友元函式不屬於類的成員函式,不能被繼承。
eg: