首先我們先做個例子試試看可以嗎?
class A{
public : A(){};
~A() = default;
static virtual void test() {
}
};
int main()
{
A a;
return 0;
}
編譯結果報錯:
經過查詢資料得知
- 首先的話,靜態函數是不和任何類對象或類實例相關聯,所以就算給函數加上viruatl是沒有任何意義的
- 靜態與非靜態成員函數之間有一個主要的區別,就是靜態成員函數可以不通過this指針來進行調用
- 虛函數依靠vptr和vtable來處理.vptr是一個指針,在類的構造函數中創建生成,並且只能用this去當問它,因爲vptr是類的成員之一,並且vptr指向保存虛函數地址的vtable
- 對於靜態成員函數,沒有this指針,沒有辦法訪問vptr.爲什麼static函數不能爲virtual
- 虛函數的調用關係 this -> vptr - >vtable -> virtual function