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

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