ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目3 配列をポリモーフィズム的に扱ってはいけない

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 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内で配列を削除した場合は、基底クラスのデストラクタしか実行されない。
派生クラスオブジェクトの配列を、基底クラスのポインタを通して削除すると結果は不定になる。

まとめ
ポリモーフィズムとポインタ演算を混ぜてはいけない。