結構函數不克不及聲明為虛函數的緣由及剖析。本站提示廣大學習愛好者:(結構函數不克不及聲明為虛函數的緣由及剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是結構函數不克不及聲明為虛函數的緣由及剖析正文
1. 從存儲空間角度,虛函數對應一個指向vtable虛函數表的指針,這年夜家都曉得,可是這個指向vtable的指針實際上是存儲在對象的內存空間的。成績出來了,假如結構函數是虛的,就須要經由過程 vtable來挪用,可是對象還沒有實例化,也就是內存空間還沒有,怎樣找vtable呢?所以結構函數不克不及是虛函數。
2. 從應用角度,虛函數重要用於在信息不全的情形下,能使重載的函數獲得對應的挪用。結構函數自己就是要初始化實例,那應用虛函數也沒有現實意義呀。所以結構函數沒有需要是虛函數。虛函數的感化在於經由過程父類的指針或許援用來挪用它的時刻可以或許釀成挪用子類的誰人成員函數。而結構函數是在創立對象時主動挪用的,弗成能經由過程父類的指針或許援用去挪用,是以也就劃定結構函數不克不及是虛函數。
3. 結構函數不須要是虛函數,也不許可是虛函數,由於創立一個對象時我們老是要明白指定對象的類型,雖然我們能夠經由過程試驗室的基類的指針或援用去拜訪它但析構卻紛歧定,我們常常經由過程基類的指針來燒毀對象。這時候候假如析構函數不是虛函數,就不克不及准確辨認對象類型從而不克不及准確挪用析構函數。
4. 從完成上看,vbtl在結構函數挪用後才樹立,因此結構函數弗成能成為虛函數從現實寄義上看,在挪用結構函數時還不克不及肯定對象的真實類型(由於子類會調父類的結構函數);並且結構函數的感化是供給初始化,在對象性命期只履行一次,不是對象的靜態行動,也沒有需要成為虛函數。
5. 當一個結構函數被挪用時,它做的重要的工作之一是初始化它的VPTR。是以,它只能曉得它是“以後”類的,而完整疏忽這個對象前面能否還有繼續者。當編譯器為這個結構函數發生代碼時,它是為這個類的結構函數發生代碼——既不是為基類,也不是為它的派生類(由於類不曉得誰繼續它)。所以它應用的VPTR必需是關於這個類的VTABLE。並且,只需它是最初的結構函數挪用,那末在這個對象的性命期內,VPTR將堅持被初始化為指向這個VTABLE, 但假如接著還有一個更晚派生的結構函數被挪用,這個結構函數又將設置VPTR指向它的 VTABLE,等.直到最初的結構函數停止。VPTR的狀況是由被最初挪用的結構函數肯定的。這就是為何結構函數挪用是從基類到加倍派生類次序的另外一個來由。然則,當這一系列結構函數挪用正產生時,每一個結構函數都曾經設置VPTR指向它本身的VTABLE。假如函數挪用應用虛機制,它將只發生經由過程它本身的VTABLE的挪用,而不是最初的VTABLE(一切結構函數被挪用後才會有最初的VTABLE)。