父類(lèi)指針指向子類(lèi)內(nèi)存,為什么當(dāng)父類(lèi)的成員函數(shù)不加virtual時(shí),訪問(wèn)的還是父類(lèi)的成員函數(shù),而不是子類(lèi)同名的成員函數(shù)?
父類(lèi)指針指向子類(lèi)內(nèi)存,為什么當(dāng)父類(lèi)的成員函數(shù)不加virtual時(shí),訪問(wèn)的還是父類(lèi)的成員函數(shù),而不是子類(lèi)同名的成員函數(shù)?
畢竟父類(lèi)指向的是子類(lèi)的內(nèi)存,只能訪問(wèn)到子類(lèi)的函數(shù),和繼承自父類(lèi)的函數(shù)。
2017-04-05
我認(rèn)為是這樣,類(lèi)的成員函數(shù)都在代碼區(qū),不同的類(lèi)的成員函數(shù)在代碼區(qū)有自己的類(lèi)名稱(chēng)空間限制,類(lèi)的虛函數(shù)在虛函數(shù)表中,程序執(zhí)行的時(shí)候,是先在虛函數(shù)表中找該成員函數(shù),如果沒(méi)有找到,就去該類(lèi)在代碼區(qū)的成員函數(shù)中去找。
所以如果父類(lèi)的成員函數(shù)加上virtual時(shí),訪問(wèn)的時(shí)候是先在虛函數(shù)表中查找,如果找到了,就執(zhí)行,沒(méi)找到就再在該類(lèi)的代碼區(qū)查找。所以父類(lèi)普通的成員函數(shù)只能在父類(lèi)的代碼區(qū)找到。
也就是說(shuō)通過(guò)父類(lèi)指針找普通成員函數(shù)時(shí),雖然父類(lèi)指針指向子類(lèi)對(duì)象,通過(guò)父類(lèi)指針只能訪問(wèn)子類(lèi)對(duì)象的數(shù)據(jù)成員(部分,父類(lèi)獨(dú)有的),不能訪問(wèn)子類(lèi)對(duì)象的成員函數(shù)(與父類(lèi)同名),如果想要訪問(wèn),只能將子類(lèi)的成員函數(shù)變成虛函數(shù),放進(jìn)虛函數(shù)表中,這樣父類(lèi)指針才可以優(yōu)先找到虛函數(shù)表中的成員函數(shù),但是這個(gè)成員函數(shù)是子類(lèi)的;
2018-01-23
當(dāng)基類(lèi)中的數(shù)據(jù)成員和成員函數(shù)與派生類(lèi)的相同的時(shí)候,又因?yàn)榕缮?lèi)的成員是在父類(lèi)之下的,所以在沒(méi)有虛函數(shù)的情況下,就會(huì)是先訪問(wèn)父類(lèi)的。如果有虛函數(shù)的時(shí)候,就要先考慮虛函數(shù)表了,因?yàn)楦割?lèi)的和子類(lèi)的同名,子類(lèi)中的虛函數(shù)的地址就會(huì)覆蓋住父類(lèi)的,從而訪問(wèn)的是子類(lèi)的
2016-10-23
父類(lèi)指針指向子類(lèi)內(nèi)存,應(yīng)該是子類(lèi)里的成員函數(shù)對(duì)父類(lèi)進(jìn)行了初始化吧,指針始終還是父類(lèi)的,只是其成員可以由子類(lèi)初始化,那么用該指針調(diào)用同名函數(shù)時(shí)自然調(diào)用的是被子類(lèi)初始化了的父類(lèi)成員函數(shù)了。