More Effective C++ 項目3 配列をポリモーフィズム的に扱ってはいけない
新訂版 More Effective C++ (AddisonーWesley professional co)
- 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/06/29
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 129回
- この商品を含むブログ (43件) を見る
項目3 配列をポリモーフィズム的に扱ってはいけない
派生クラスの配列を、基底クラスのポインタや参照で扱うのはまずい。
class A { ... }; class B : public A { ... }; void print(ostream& s, A array[], int numElements) { for (int i = 0; i < numElements; ++i) { s << array[i]; } }
Aの配列を受け取る関数にBの配列を渡した場合、array[i]の部分で、i+1されたときにいったいどれくらいポインタがずれるのか、が問題になる。
派生クラスは一般に基底クラスより多くのメンバを持つため、ポインタ演算が不正となり何が起きるかわからない。
delete [] array;
上記の関数print内で配列を削除した場合は、基底クラスのデストラクタしか実行されない。
派生クラスオブジェクトの配列を、基底クラスのポインタを通して削除すると結果は不定になる。
まとめ
ポリモーフィズムとポインタ演算を混ぜてはいけない。