-
virtual 不能修飾普通函數(shù)
virtual不能修飾靜態(tài)成員函數(shù)
virtual不能修飾內(nèi)聯(lián)函數(shù)(會忽略掉inline而成為虛函數(shù))
構造函數(shù)不能為虛函數(shù)
查看全部 -
當父類定義一個虛函數(shù)時,隨即創(chuàng)建了一個虛函數(shù)表指針
查看全部 -
靜態(tài)綁定(早綁定):在編譯階段已經(jīng)確定使用哪一個函數(shù)
動態(tài)多態(tài)(晚綁定):以封裝和繼承為基礎,用虛函數(shù)實現(xiàn)
查看全部 -
純虛函數(shù)不能實例化對象,但可以指向子類地址!!!
查看全部 -
我們可以為純虛函數(shù)提供定義,不過函數(shù)體必須定義在類的外部。若定義在類的內(nèi)部,會出現(xiàn)錯誤
查看全部 -
VIRTUAL只需要加在父類里邊(析構函數(shù)和同名成員函數(shù))就好,析構函數(shù)前邊加是為了防止沒有釋放子類對象的內(nèi)存導致內(nèi)存泄露,同名成員函數(shù)前加是為了父類實例化的對象指針能夠指向子類數(shù)據(jù)成員。
如果我們沒有在子類當中定義同名的虛函數(shù),那么在子類虛函數(shù)表中就會寫上父類的虛函數(shù)的函數(shù)入口地址;如果我們在子類當中也定義了虛函數(shù),那么在子類的虛函數(shù)表中我們就會把原來的父類的虛函數(shù)的函數(shù)地址覆蓋一下,覆蓋成子類的虛函數(shù)的函數(shù)地址,這種情況就稱之為函數(shù)的覆蓋。
查看全部 -
虛函數(shù)實現(xiàn)多態(tài)的原理:
虛函數(shù)表指針(指向了虛函數(shù)表的首地址)->虛函數(shù)表(地址的偏移找到對應的虛函數(shù)的地址)->虛函數(shù)。
在父類指針指向子類實例時:
? 如果子類中沒有定義相同名稱的虛函數(shù),就會從從父類中繼承了,所以在實例化時會產(chǎn)生一個虛函數(shù)表(跟父類中的不是同一個,即虛函數(shù)表指針不同),但是相應函數(shù)(比如計算面積)的函數(shù)指針是一樣的(同樣的入口地址)。
? 如果在子類中定義了同名的虛函數(shù),就會在子類的虛函數(shù)列表中將父類中定義的虛函數(shù)的函數(shù)地址覆蓋掉,從而實現(xiàn)多態(tài)。
【虛析構函數(shù)的原理】:通過父類類指針指向子類實例的內(nèi)存空間,找到子類的虛函數(shù)表指針所指向的虛函數(shù)表,然后在表中找到虛析構函數(shù)地址,從而找到虛析構函數(shù)執(zhí)行子類的虛析構函數(shù),再自動執(zhí)行父類的虛析構函數(shù)。
補充1:理論前提,執(zhí)行完子類的析構函數(shù)后,會執(zhí)行父類的析構函數(shù)。
補充2:C++中的虛函數(shù)的作用主要是實現(xiàn)了多態(tài)的機制。關于多態(tài),簡而言之就是用父類型別的指針指向其子類的實例,然后通過父類的指針調用實際子類的成員函數(shù)。
這種技術可以讓父類的指針有“多種形態(tài)”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的代碼來實現(xiàn)可變的算法。
?比如:模板技術,RTTI技術,虛函數(shù)技術,要么是試圖做到在編譯時決議,要么試圖做到運行時決議。
查看全部 -
虛函數(shù)特性可以被繼承,當子類中定義的函數(shù)與父類中虛函數(shù)的聲明相同時,該函數(shù)也是虛函數(shù)。只是平時我們都習慣在子類的虛函數(shù)前面也加上virtual關鍵字。
查看全部 -
并不是所有的都加上virtual就完事了。
1、使用virtual會產(chǎn)生一個虛擬指針表,要維持這個表,便額外加大了系統(tǒng)的開銷。
2、也不是所有的成員函數(shù)都需要實現(xiàn)多態(tài)的,總有些函數(shù)實現(xiàn)的功能意義時固定的,比如說加減乘除
3、虛繼承無非是為了避免諸如菱形繼承的情況,在我們構建類圖的時候,就需要考慮到這些問題,如果能不用虛繼承,就不用咯。
綜上,應該是能不用就不用,C++就是以號稱節(jié)省資源,運行效率高的。如果在寫程序的時候,使得消耗過多的系統(tǒng)資源,便失去了這門語言高效的意義了。那還不如直接用一些新興的語言如GO,SCALA之類的了。
查看全部 -
Shape 類的析構函數(shù)前 如果沒加virtual,則只會執(zhí)行父類的 析構函數(shù),如果加了 virtual,則先執(zhí)行子類的析構函數(shù),在執(zhí)行父類的析構函數(shù)。
如果加了 virtual 父類就會通過虛函數(shù)表 和虛函數(shù)表指針 找到子類的析構函數(shù) 從而釋放掉子類對象。
查看全部 -
虛函數(shù)=0就是純虛函數(shù)
含有純虛函數(shù)的類叫做抽象類
抽象類無法實例化對象
查看全部 -
覆蓋只是在虛函數(shù)列表中將函數(shù)指針替換掉。 如果通過類去訪問,還是可以訪問的。
覆蓋僅指父類中有virtual修飾的函數(shù)且子類中剛好有同名函數(shù),則發(fā)生覆蓋,
使用父類指針指向子類對象時,指向的是繼承的成員函數(shù),而子類對象特有的部分,父類對象無法實現(xiàn)訪問。
查看全部 -
父類有虛析構函數(shù),子類會繼承虛析構函數(shù)
有虛析構函數(shù)的class創(chuàng)建的對象里有虛函數(shù)指針,占4個內(nèi)存單元,虛函數(shù)指針指向虛函數(shù)表,虛函數(shù)指針的值是虛函數(shù)表的地址。
查看全部 -
虛析構函數(shù)是為了避免使用父類指針釋放子類對象時造成內(nèi)存泄露
查看全部 -
virtrual 不能修飾:
1普通函數(shù)
2靜態(tài)函數(shù)static
3內(nèi)聯(lián)函數(shù)inline
4構造函數(shù)
查看全部
舉報