不要用多态处理数组

很好理解,也很实用。

首先复习一下数组的使用说明:

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)吗?
移动到下一个对象位置的时候,就会立马出错!大多数子类都会增加内部成员变量,成员函数。

所以后面的结局将是不可想象的~

原文地址:https://www.cnblogs.com/skyhuangdan/p/6298488.html