1.虛函數(shù)表存放的內(nèi)容
答:虛函數(shù)表實(shí)際是一個(gè)數(shù)組,數(shù)組里存放的是虛函數(shù)的地址指針,指向虛函數(shù)。
虛函數(shù)表的由來:如果一個(gè)類中有虛函數(shù),則每一個(gè)該類的對(duì)象都會(huì)被編譯器添加一個(gè)成員:虛函數(shù)表指針,這個(gè)虛函數(shù)表指針指向虛函數(shù)表,虛函數(shù)表本質(zhì)是一個(gè)數(shù)組,數(shù)組中存放類中虛函數(shù)地址指針,指向虛函數(shù)。
2.虛函數(shù)表指針與虛函數(shù)表的存放位置★
答:(當(dāng)前的答案不一定正確僅供參考)
①虛函數(shù)表是class specific的,也就是針對(duì)一個(gè)類來說的,這里有點(diǎn)像一個(gè)類里面的staic成員變量,即它是屬于一個(gè)類所有對(duì)象的,不是屬于某一個(gè)對(duì)象特有的,是一個(gè)類所有對(duì)象共有的。
②虛函數(shù)表是編譯器來選擇實(shí)現(xiàn)的,編譯器的種類不同,可能實(shí)現(xiàn)方式不一樣,就像前面我們說的vptr在一個(gè)對(duì)象的最前面,但是也有其他實(shí)現(xiàn)方式,不過目前gcc 和微軟的編譯器都是將vptr放在對(duì)象內(nèi)存布局的最前面。
③實(shí)際上虛函數(shù)指針是在構(gòu)造函數(shù)執(zhí)行時(shí)初始化的,而虛函數(shù)表是存放在可執(zhí)行文件中的。在gcc編譯器的實(shí)現(xiàn)中虛函數(shù)表vtable存放在可執(zhí)行文件的只讀數(shù)據(jù)段.rodata中
3.構(gòu)造函數(shù)可以是虛函數(shù)嗎,為什么?
答:不可以,可以從兩方面解釋:第一,虛函數(shù)的作用就是在于信息不全的時(shí)候可以重載函數(shù)得到對(duì)應(yīng)的調(diào)用。構(gòu)造函數(shù)本身就是要初始化實(shí)例,那使用虛函數(shù)也就沒有實(shí)際意義。所以構(gòu)造函數(shù)沒有必要是虛函數(shù);第二,每一個(gè)虛函數(shù)對(duì)象對(duì)應(yīng)一個(gè)虛函數(shù)指針,指向該類的一個(gè)虛函數(shù)表,虛函數(shù)指針內(nèi)存被分配在虛函數(shù)對(duì)象存儲(chǔ)空間的頭部,而一個(gè)類中虛函數(shù)表的創(chuàng)建是在構(gòu)造函數(shù)中被創(chuàng)建的,如果構(gòu)造函數(shù)本身就是虛函數(shù),那在執(zhí)行構(gòu)造函數(shù)的時(shí)候就需要找對(duì)應(yīng)的虛函數(shù)指針和虛函數(shù)表,而此時(shí)虛表指針和虛表還沒有被創(chuàng)建,則無法完成查找虛表而報(bào)錯(cuò)。
用一個(gè)不太恰當(dāng)?shù)谋扔鳎豪缫粋€(gè)顯赫的家族(相當(dāng)于一個(gè)類),里面可能有很多人享受著祖上的財(cái)富而吃喝玩樂,虛度光陰(虛成員函數(shù)),但是在一個(gè)家族中,歸根到底總要有一個(gè)刻苦努力的人來打下基業(yè)(創(chuàng)建虛函數(shù)表),這個(gè)能干有才的人就是構(gòu)造函數(shù)。如果假設(shè)這個(gè)打基業(yè)的人也是一個(gè)無所事事的人,那豈不是打了個(gè)寂寞,后面的假設(shè)也就都不成立了。
4.析構(gòu)函數(shù)可以是虛函數(shù)嗎,為什么?
答:析構(gòu)函數(shù)可以是虛函數(shù),且一般基類的析構(gòu)函數(shù)均設(shè)置為虛函數(shù),如果基類析構(gòu)函數(shù)不為虛函數(shù),那么當(dāng)new-delete指向子類對(duì)象的基類指針時(shí),執(zhí)行的操作如下:
基類構(gòu)造函數(shù)-子類構(gòu)造函數(shù)-基類的析構(gòu)函數(shù);
從而導(dǎo)致子類沒有執(zhí)行子類的析構(gòu)函數(shù)而導(dǎo)致內(nèi)存泄露。
當(dāng)基類的析構(gòu)函數(shù)被設(shè)置為虛函數(shù)時(shí),當(dāng)new-delete指向子類對(duì)象的基類指針時(shí),執(zhí)行的操作如下:
基類構(gòu)造函數(shù)-子類構(gòu)造函數(shù)-子類析構(gòu)函數(shù)-基類析構(gòu)函數(shù);
這樣就保證內(nèi)存空間不會(huì)產(chǎn)生泄露。