inheritance的重要性質(zhì)就是你可以通過指向base class objects的pointers或者references來操作derived class object.
同樣C++也允許你使用pointers或者references來操作derived class object形成的數(shù)組。但是這樣的行為很危險(xiǎn),幾乎不會(huì)按你設(shè)定的方式運(yùn)作。
我們來舉個(gè)例子:
?
class?A{
};
?
class?B:public?A{
};

?
//現(xiàn)在我們有一個(gè)函數(shù)
void?printAArray(ostream&?s,const?A?array[],int?numElement)
{
?????? for(int?i=0;i<numElement;++i)
??????{
??????????? s<<array[i];//假設(shè)A?objects中有一個(gè)operator<<可以用?
????? }
}
當(dāng)你把A AArray[10];傳給他
...
printAArray(cout,AArray,10);//運(yùn)作良好
但是當(dāng)你把B BArray傳給他
printAArray(cout,BArray,10);//還能正常運(yùn)作嗎
毫無疑問,編譯時(shí)編譯器會(huì)很開心的接受他。但是運(yùn)行時(shí)呢
?
for(int?i=0;i<numElement;++i)
??{
??????????? s<<array[i];//假設(shè)A?objects中有一個(gè)operator<<可以用?
?}
就會(huì)出問題,array所指向的內(nèi)存和array+i所指向的內(nèi)存有多遠(yuǎn)的距離
答案是i*sizeof(A),但是我們在穿BArray的時(shí)候我們需要的是i*sizeof(B),因?yàn)?br />derived class object通常比base class object 大。
同樣你通過bass class來刪除derived class object的時(shí)候,都會(huì)產(chǎn)生不可預(yù)期的錯(cuò)誤
簡單的說,大家需要注意的一點(diǎn)就是,數(shù)組不要和多態(tài)進(jìn)行混合使用,因?yàn)閿?shù)組總是會(huì)涉及指針
的算術(shù)運(yùn)算。
當(dāng)然這個(gè)也不是絕對的,都是內(nèi)存訪問惹的禍
如果你能夠避免一個(gè)具象類(帶有參數(shù)的類)繼承自另外的一個(gè)具象類,你就不太能犯
下這樣的錯(cuò)誤。
具體的內(nèi)容我晚上在下一篇隨筆里面進(jìn)行介紹