C++ 多態 虛函數

來源:互聯網
上載者:User

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指標,也需要額外的操作

由此來判斷是否適合使用虛函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.