条款3:绝对不要以多态的方式处理数组
class BST{ ...... };
class BalancedBST:public BST{.......};
void printBST(ostream& s,const BST array[ ],int num)
{
for(int i = 0;i<num;i++)
s<<array[i];
}
当你传入BST的数组是没有什么问题的。
现在传入BalanceBST呢?
BalanceBST bBST[10];
printBST(cout,bBST,10);
编译器会毫无怨言的接受,但是我们看看这个循环
for(int i = 0;i<num;++i)
s<<array[i];
我们知道array与array[i]之间的距离为i*sizeof(BST),所以编译器每次都是这样移动的。现在我们传入了派生类的对象,那么sizeof(BalanceBST)与sizeof(BST)不一定相等。所以array[i]移动的距离也不一定相等。
同样你用一个指向base的指针删除一个指向派生类的数组,也是有可能出现错误的。
条款4:非必要不提供default constructor
所谓default constructor是否提供的问题有很大的争论。有些对象提供default constructor 构造出来的对象是没任何意义的,但是如果没有,对于定义数组对象又不方便。假如添加了default constructor那么每次都要检查是否有效,对程序的效率造成影响。本条款的意思是非必要就不提供default constructor了。