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

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