03項 配列をポリモルフィズム的には扱わない

配列をポリモルフィズム的には扱わない



本書の例を引用します。

class BST{...};
class BalancedBST{...};

void printBSTArray(ostream &s, const BST array[], int numElements)
{
    for (int i = 0; i < numElements; i++)
    {
        s << array[i]; //オーバロード済みと仮定
    }
}


BalancedBST bBstArray[10];
printBSTArray(cout, bBstArray, 10); //おかしな挙動になる。

問題となる部分は、"array[i]"の部分です。
"array[i]"はBSTの配列なので、コンパイラによって"*(array+i*sizeof(BST))"に書き換えられます。
しかし、引数にはBalancedBSTの配列が指定されているので、おかしな挙動になります。


対策は、BSTを抽象クラスにし、実体の配列ではなくポインタの配列としてポリモルフィズムを実現することです。