C++ 繼承中的類(lèi)作用域
當(dāng)存在繼承關(guān)系時(shí),派生類(lèi)的作用域嵌套在其基類(lèi)的作用域之內(nèi),也就是說(shuō)如果一個(gè)名字在派生類(lèi)中無(wú)法解析,就會(huì)繼續(xù)在外層基類(lèi)中解析。
在編譯時(shí)進(jìn)行名字查找
即使動(dòng)態(tài)對(duì)象和靜態(tài)對(duì)象可能不一致,但是我們能夠使用哪些成員是由靜態(tài)類(lèi)型決定的。
即我們使用一個(gè)基類(lèi)的指針或引用綁定一個(gè)派生類(lèi)時(shí),即使派生類(lèi)中確實(shí)含有某個(gè)成員,但是如果基類(lèi)不含有這個(gè)成員,我們使用基類(lèi)的指針或引用去調(diào)用這個(gè)成員時(shí),依舊是錯(cuò)誤的。
名字沖突與繼承
和普通函數(shù)一樣,派生類(lèi)也能重定義基類(lèi)的名字,此時(shí)定義域內(nèi)將隱藏外層作用域的名字
注:我們可以通過(guò)作用域運(yùn)算符來(lái)在派生類(lèi)的作用域內(nèi)訪(fǎng)問(wèn)被隱藏的名字。
名字查找優(yōu)先于類(lèi)型檢查
派生類(lèi)中重新定義基類(lèi)中的名字時(shí),即使派生類(lèi)的參數(shù)列表和基類(lèi)不一樣,基類(lèi)成員也會(huì)在調(diào)用時(shí)被隱藏掉。
虛函數(shù)和作用域
現(xiàn)在我們可以理解為什么基類(lèi)和派生類(lèi)的虛函數(shù)必須具有相同的參數(shù)列表了。因?yàn)槿绻麉?shù)列表不同的話(huà)我們動(dòng)態(tài)綁定時(shí),就無(wú)法用基類(lèi)的引用或指針來(lái)使用派生類(lèi)的虛函數(shù)了。
對(duì)于上面的a->fcn,由于fcn是虛函數(shù),所以編譯器會(huì)在運(yùn)行時(shí)判斷是誰(shuí)調(diào)用了他,a綁定了D1但是D1沒(méi)有覆蓋不含參數(shù)的版本,所以編譯器會(huì)在外層的Base中調(diào)用fcn。
而對(duì)于非虛函數(shù)
b的fcn為非虛函數(shù)所以直接調(diào)用D1的fcn(int),c調(diào)用D2的fcn(int)
容器和繼承
容器中不允許使用不同類(lèi)型的元素,所以我們不能把具有繼承關(guān)系的多種類(lèi)型對(duì)象存放在容器中。
如果我們使用基類(lèi)類(lèi)型為容器的元素,那么派生類(lèi)的對(duì)象放置在容器中時(shí)他就不再是派生類(lèi)對(duì)象了,它的派生部分將會(huì)被忽略。
在容器中存放指針而非對(duì)象
我們可以把一個(gè)派生類(lèi)的智能指針轉(zhuǎn)換為基類(lèi)的智能指針。