不要用多态处理数组
很好理解,也很实用。
首先复习一下数组的使用说明:
class animal{.........};
class dog : public animal{.........};
这时我们定义一个数组:
dog manyDog[100]; //这里我们申请了100个dog大小的空间。
我们知道: manyDog[index] 其实是等于 *(manyDog + 1)
意思就是 manyDog是个执行数组起始处的指针。 manyDog 指向的内存跟 manyDog+i 指向的内存相隔多远?
答案: i*sizeof(数组的对象)
然后我们把数组跟多态放在一起:
有个函数:
void DeleteArray(const animal arry[] )
{
dalete[] arry;
}
这个时候我们把上面定义的manyDog数组传进去会发生什么?
DeleteArray(manyDog);
这样机器变异是不会报错的!!
然而由于Delete被声明的传参是animal类型(父类),所以在批量删除的时候,还记得上面的 (manyDog + i)吗?
移动到下一个对象位置的时候,就会立马出错!大多数子类都会增加内部成员变量,成员函数。
所以后面的结局将是不可想象的~