Item 3: 不要對數組使用多態
語言規范中說通過一個基類指針來刪除一個含有派生類對象的數組,結果將是不確定的。
[cpp]
01.class BST { ... };
02.class BalancedBST: public BST { ... };
03.
04.void printBSTArray(ostream& s,const BST array[], int numElements)
05.{
06. for (int i = 0; i < numElements; )
07. {
08. s << array[i]; //假設 BST 類重載了操作符<<
09. }
10.}
class BST { ... };
class BalancedBST: public BST { ... };
void printBSTArray(ostream& s,const BST array[], int numElements)
{
for (int i = 0; i < numElements; )
{
s << array[i]; //假設 BST 類重載了操作符<<
}
}
編譯器原先已經假設數組中元素與 BST 對象的大小一致,但是現在數組中每一個對象大小卻與 BalancedBST 一致。派生類的長度通常都比基類要長。我們料想 BalancedBST 對象長度的比 BST 長。如果如此的話,printBSTArray 函數生成的指針算法將是錯誤的,沒有人知道如果用 BalancedBST 數組來執行 printBSTArray 函數將會發生什麼樣的後果。不論是什麼後果都是令人不愉快的。
值得注意的是如果你不從一個具體類(concrete classes) (例如 BST)派生出另一個具體類(例如 BalancedBST),那麼你就不太可能犯這種使用多態性數組的錯誤。