C++編譯器在編譯時間建立資料結構,以便在執行時支援多態。多態是通過三個層次的指標(三層間接訪問)實現
第一層: 當C++編譯包含一個或者多個虛函數的類時,會為這個類建立一個vtable(虛函數表)(C++中實現基類虛函數的子類的函數也是虛函數)。每當調用這個類的虛函數,正在執行的程式都會利用這個vtable選擇選擇合適的函數實現 (最左邊) vtable中存放的是函數指標 vtable中的函數指標指向調用虛函數執行的實際函數 它是指標鏈的最後一環
第二層: 只要執行個體化帶有一個或者多個虛函數的類的類對象時,編譯器就會將這個對象連結到指向這個類的vtable的指標 注意是vtable指標 就是指標鏈的第二環
第三層:簡單包含接收虛函數調用的物件控點,這個層次的控制代碼也可以是應用
終於明白指標的概念,在單片機中,51是8位,指標是式8位的,可以定址2的8次方 在電腦中 PC機是32位 指標式32位 每個指標佔4個位元組
結合圖片 調用虛函數 編譯器產生的代碼執行如下幾個操作(首字母小寫表示對象 大寫表示類)
1.選擇employee中第i項,(這裡即為hourlyEmployee的對象指標),並將它作為實參傳遞給函數,這就將baseClassPtr參數設定成了指向hourlyEmployee
2.解除這個指標的引用,獲得hourlyEmployee對象。這個對象以一個指向HourlyEmployee類的vtable的指標開始
3.解除引用hourlyEmployee對象的vtable指標獲得HourlyEmployee類的vtable
4.跳過4個位元組的位移量,選擇print函數指標(由於print函數指標在vtable中排在第二位 跳 過第一個函數指標 共4個位元組)
5.解除print函數的指標引用,形成要執行的實際函數的名稱
調用每個虛函數時的指標解除引用操作和記憶體訪問,都需要一些額外的執行時間,添加到對象的vtable和vtable指標,也需要額外的操作
由此來判斷是否適合使用虛函數