-
純虛函數(shù):virtual int func() = 0;不需要去實(shí)現(xiàn)函數(shù)的時(shí)候用。 純虛函數(shù)在虛函數(shù)列表中存儲(chǔ)的值就是0,他并沒(méi)有存儲(chǔ)一個(gè)具有實(shí)際意義的指針。
含有純虛函數(shù)的類(lèi)叫抽象類(lèi)。哪怕只含有一個(gè)純虛函數(shù)也叫抽象類(lèi)。
抽象類(lèi)不允許實(shí)例化對(duì)象。
抽象類(lèi)的子類(lèi)也可以是抽象類(lèi)。
抽象類(lèi)的子類(lèi)只有把抽象類(lèi)當(dāng)中的所有純虛函數(shù)都做了實(shí)現(xiàn),這個(gè)子類(lèi)才可以實(shí)例化對(duì)象。
查看全部 -
當(dāng)類(lèi)中沒(méi)有虛函數(shù)的時(shí)候:
? ? ? ?我們通過(guò)類(lèi)的對(duì)象訪(fǎng)問(wèn)其數(shù)據(jù)成員,訪(fǎng)問(wèn)其成員函數(shù);前面已經(jīng)知道,實(shí)例化對(duì)象時(shí),只有數(shù)據(jù)成員的大小,這說(shuō)明類(lèi)的成員函數(shù)是統(tǒng)一放在內(nèi)存代碼區(qū)的,并且有自己的類(lèi)名稱(chēng)空間作為限制,只能自己實(shí)例化的對(duì)象訪(fǎng)問(wèn);所以我們通過(guò)對(duì)象訪(fǎng)問(wèn)數(shù)據(jù)成員,是直接在對(duì)象的內(nèi)存塊中偏移得到;而通過(guò)對(duì)象訪(fǎng)問(wèn)成員函數(shù),則是要到代碼區(qū)才能訪(fǎng)問(wèn)到;
當(dāng)父類(lèi)與子類(lèi)之間有重名函數(shù)時(shí):
(1)通過(guò)子類(lèi)對(duì)象訪(fǎng)問(wèn)父類(lèi)該重名函數(shù)(于是有了隱藏):
? ? ? ? 父類(lèi)與子類(lèi)有重名函數(shù)時(shí),這時(shí)出現(xiàn)了隱藏,即子類(lèi)是繼承了父類(lèi)的該重名函數(shù)的,但是將其隱藏了。通過(guò)子類(lèi)對(duì)象訪(fǎng)問(wèn)該函數(shù)時(shí),訪(fǎng)問(wèn)的是子類(lèi)自己的該函數(shù),如果想要訪(fǎng)問(wèn)父類(lèi)的該函數(shù),則要在函數(shù)前面加上父類(lèi)的名稱(chēng)空間限定;代碼示例如下:父類(lèi)Person和子類(lèi)Worker,都有一個(gè)同名函數(shù)name();通過(guò)子類(lèi)對(duì)象worker調(diào)用父類(lèi)該函數(shù)時(shí),worker.Person::name();
(2)通過(guò)父類(lèi)指針指向子類(lèi)對(duì)象,并訪(fǎng)問(wèn)子類(lèi)重名函數(shù)(于是有了虛函數(shù)):
? ? ? ? 父類(lèi)指針指向子類(lèi)對(duì)象時(shí),父類(lèi)指針只能訪(fǎng)問(wèn)子類(lèi)對(duì)象的數(shù)據(jù)成員(部分,繼承自父類(lèi)的),和訪(fǎng)問(wèn)父類(lèi)在代碼區(qū)的自己的成員函數(shù);此時(shí),如果想要通過(guò)父類(lèi)指針訪(fǎng)問(wèn)到子類(lèi)對(duì)象的成員函數(shù)(即通過(guò)父類(lèi)指針調(diào)用子類(lèi)的析構(gòu)函數(shù)或者普通重名函數(shù)),就要將該重名函數(shù)設(shè)定為虛函數(shù),然后將虛函數(shù)地址放進(jìn)該類(lèi)的虛函數(shù)表中(于是有了覆蓋,即在子類(lèi)虛函數(shù)表中用子類(lèi)虛函數(shù)地址覆蓋掉父類(lèi)虛函數(shù)地址),而對(duì)象又多了個(gè)數(shù)據(jù)成員(虛函數(shù)表指針),且在對(duì)象內(nèi)存塊首位;這樣當(dāng)我們用父類(lèi)指針指向子類(lèi)對(duì)象,且調(diào)用子類(lèi)重名虛函數(shù)時(shí),就要先在虛函數(shù)表中查找,如果找到,就執(zhí)行;即調(diào)用成員函數(shù)時(shí),有虛函數(shù)表先在虛函數(shù)表中查找,然后再在代碼區(qū)查找;
? ? ? ? 這里我只解釋了父類(lèi)指針訪(fǎng)問(wèn)子類(lèi)重名函數(shù)的情況,沒(méi)有解釋虛析構(gòu)函數(shù)不重名也能訪(fǎng)問(wèn)的情況。我想可能是析構(gòu)函數(shù)有自己特殊的用法吧,可能每個(gè)類(lèi)的析構(gòu)函數(shù)都是同一個(gè)名字,而在代碼中名字是不同的吧。這里如果有同學(xué)想明白了,希望能不吝賜教;
(3)通過(guò)子類(lèi)對(duì)象初始化父類(lèi)對(duì)象,通過(guò)父類(lèi)對(duì)象不能訪(fǎng)問(wèn)子類(lèi)重名函數(shù)(虛):
? ? ? ? 按照上面的理論,子類(lèi)對(duì)象初始化父類(lèi)對(duì)象后,子類(lèi)對(duì)象的數(shù)據(jù)成員會(huì)覆蓋掉父類(lèi)對(duì)象的數(shù)據(jù)成員,但是這里,父類(lèi)原有的虛函數(shù)表是沒(méi)有被覆蓋掉的,父類(lèi)對(duì)象的虛函數(shù)表指針還是自己的表指針;表指針里的虛函數(shù)地址還是父類(lèi)自己的虛函數(shù)地址,所以此時(shí)通過(guò)父類(lèi)對(duì)象只能訪(fǎng)問(wèn)到子類(lèi)對(duì)象的數(shù)據(jù)成員(繼承自父類(lèi)的),訪(fǎng)問(wèn)自己代碼區(qū)的成員函數(shù)和虛函數(shù)列表中的自己的虛函數(shù),不能訪(fǎng)問(wèn)到子類(lèi)虛函數(shù)列表中的虛函數(shù);
查看全部 -
對(duì)象的大小
(1)類(lèi)實(shí)例化對(duì)象時(shí),對(duì)象的大小就是類(lèi)中數(shù)據(jù)成員所占的內(nèi)存大?。〝?shù)據(jù)成員,不包含成員函數(shù));
(2)若類(lèi)中存在一個(gè)或多個(gè)虛函數(shù)或虛析構(gòu)函數(shù),則會(huì)在實(shí)例對(duì)象的前4個(gè)B內(nèi)存單元存放一個(gè)虛函數(shù)表指針(指針大小為4B);
注意1:每個(gè)類(lèi)只有一個(gè)虛函數(shù)表,所有該類(lèi)的對(duì)象共用一張?zhí)摵瘮?shù)表。
注意2:父類(lèi)和子類(lèi)的虛函數(shù)表不同,但虛函數(shù)表中的函數(shù)地址可能相同,指向同一個(gè)虛函數(shù)地址(這種情況父類(lèi)虛函數(shù)未被子類(lèi)的覆蓋, 沒(méi)有形成多態(tài))
(3)如果類(lèi)中沒(méi)有數(shù)據(jù)成員或虛函數(shù),則對(duì)象大小為1字節(jié),用來(lái)標(biāo)識(shí)對(duì)象的存在。
查看全部 -
沒(méi)有數(shù)據(jù)成員的類(lèi),實(shí)例化以后,sizeof后的值是1,原因是C++對(duì)于沒(méi)有數(shù)據(jù)成員的對(duì)象,C++會(huì)用1個(gè)內(nèi)存單元用來(lái)標(biāo)記這個(gè)對(duì)象
查看全部 -
對(duì)象的大?。侯?lèi)實(shí)例化的對(duì)象,數(shù)據(jù)成員占據(jù)的內(nèi)存大小,成員函數(shù)不占據(jù)內(nèi)存。
對(duì)象的地址:實(shí)例化的對(duì)象,所占內(nèi)存的第一個(gè)存儲(chǔ)單元的地址
對(duì)象成員地址:實(shí)例化對(duì)象有一個(gè)或多個(gè)數(shù)據(jù)成員,每個(gè)數(shù)據(jù)成員都有自己的地址,占一定的內(nèi)存空間(數(shù)據(jù)類(lèi)型不同,地址不同)
虛函數(shù)表指針:具有虛函數(shù)的類(lèi)實(shí)例化的對(duì)象時(shí),對(duì)象的第一塊內(nèi)存中存儲(chǔ)的就是虛函數(shù)表指針
查看全部 -
通過(guò)虛析構(gòu)函數(shù),釋放父類(lèi)指針就能夠釋放子類(lèi)申請(qǐng)的內(nèi)存,有個(gè)理論前提就是:執(zhí)行完子類(lèi)的虛構(gòu)函數(shù)就會(huì)執(zhí)行父類(lèi)的析構(gòu)函數(shù)。因此只要保證能夠執(zhí)行子類(lèi)的虛構(gòu)函數(shù)即可(就相當(dāng)于子類(lèi)的和父類(lèi)的都釋放了。 當(dāng)然,只有在堆內(nèi)申請(qǐng)內(nèi)存才會(huì)出現(xiàn)要釋放內(nèi)存的過(guò)程。)
父類(lèi)指針指向子類(lèi)的時(shí)候,訪(fǎng)問(wèn)子類(lèi)的虛函數(shù)列表,可以找到子類(lèi)的虛析構(gòu)函數(shù),因此釋放父類(lèi)指針可以執(zhí)行子類(lèi)的虛析構(gòu)函數(shù)。反言之, 如果父類(lèi)和子類(lèi)的不是虛析構(gòu)函數(shù),則析構(gòu)函數(shù)不會(huì)存在與虛函數(shù)列表中,父類(lèi)指針就找不到子類(lèi)的析構(gòu)函數(shù)。
查看全部 -
函數(shù)的隱藏:定義了父類(lèi)與子類(lèi),且出現(xiàn)了同名的函數(shù),稱(chēng)為隱藏
函數(shù)的覆蓋:若在子類(lèi)中未定義同名的虛函數(shù),則子類(lèi)的虛函數(shù)表中寫(xiě)上父類(lèi)虛函數(shù)的入口地址;若在子類(lèi)中定義了同名的虛函數(shù),則在子類(lèi)的虛函數(shù)表中,子類(lèi)虛函數(shù)入口地址覆蓋原來(lái)父類(lèi)的
查看全部 -
虛函數(shù):假設(shè)存在、作為基類(lèi)方便不同子類(lèi)派生函數(shù)的存在函數(shù)。其特點(diǎn)在于,虛函數(shù)本身沒(méi)有任何意義,其只是作為一個(gè)象征:我所有的子類(lèi)都有如此一個(gè)函數(shù)存在,至于子類(lèi)的函數(shù)到底如何實(shí)現(xiàn),基類(lèi)并不知曉。
查看全部 -
函數(shù)指針的實(shí)質(zhì)是指向這段函數(shù)代碼的開(kāi)頭位置
查看全部 -
virtual在函數(shù)中的使用限制:
·普通函數(shù)不能是虛函數(shù)(編譯錯(cuò)誤)
· 靜態(tài)成員函數(shù)不能是虛函數(shù)(編譯錯(cuò)誤)
·內(nèi)聯(lián)函數(shù)不能是虛函數(shù)(可編譯,編譯器忽略inline關(guān)鍵字是函數(shù)變?yōu)榧兇馓摵瘮?shù))
·構(gòu)造函數(shù)不能是虛函數(shù)(編譯錯(cuò)誤)
查看全部 -
子類(lèi)的構(gòu)造與析構(gòu)原理--深入闡述虛析構(gòu)函數(shù)的重要性
查看全部 -
多態(tài)分為兩種 靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)? 靜態(tài)指的就是函數(shù)重載(是在一個(gè)函數(shù)或者一個(gè)類(lèi)中? )? ;而動(dòng)態(tài)多態(tài)就是 指的多個(gè)類(lèi)之間的多態(tài)??
查看全部 -
使用父類(lèi)指針指向子類(lèi)對(duì)象時(shí),調(diào)用子類(lèi)完全相同的函數(shù)時(shí)候 會(huì)執(zhí)行父類(lèi)函數(shù),需要在父類(lèi)加virtual關(guān)鍵字使父類(lèi)函數(shù)成為虛函數(shù),才能調(diào)用子類(lèi)自己的同名函數(shù)
查看全部 -
靜態(tài)多態(tài)(早綁定):成員函數(shù)同名,但參數(shù)數(shù)目不同時(shí),調(diào)用成員函數(shù)使用的參數(shù)個(gè)數(shù)決定了啟用不同的成員函數(shù)。 /*函數(shù)編譯階段就已經(jīng)確定用哪種行為*/
動(dòng)態(tài)多態(tài)(晚綁定):以封裝和繼承為基礎(chǔ),當(dāng)父類(lèi)指針指向子類(lèi)類(lèi)型時(shí),要用virtual去修飾子類(lèi)中已經(jīng)重定義的成員函數(shù)(虛函數(shù)),否則使用的是父類(lèi)的定義的成員函數(shù);子類(lèi)中的同名成員函數(shù)virtual可加可不加,系統(tǒng)默認(rèn)補(bǔ)全。
”父類(lèi)指針指向子類(lèi)對(duì)象,通過(guò)父類(lèi)指針只能尋址到從父類(lèi)繼承到的成員函數(shù)與數(shù)據(jù)成員,子類(lèi)擴(kuò)展的將會(huì)被截?cái)唷5?,如果將父?lèi)中同名函數(shù)設(shè)置為虛函數(shù),創(chuàng)建子類(lèi)對(duì)象時(shí)將會(huì)創(chuàng)建子類(lèi)自有的【虛函數(shù)表】,虛函數(shù)表指向的成員函數(shù)將覆蓋父類(lèi)中的同名函數(shù)。“
查看全部 -
對(duì)不同對(duì)象下達(dá)相同指令,但是做的不同的操作
查看全部
舉報(bào)