不要对数组使用多态

C++ 中的类继承特性使得你可以通过基类引用或指针来对派生类进行操作(多态)。同样的,这一特点也同样使用于对象数组。但请永远不要对对象数组使用多态。

假设有这样一个对基类数组进行访问的函数:

void printObjs(Base[] obj, int num){
    for (int i=0;i<num;++i){
        cout << obj[i];
    }
}

同时有基类 Base 的派生类 Child 。若程序中出现:

Child myObj[10];
// 对 myObj 所有元素初始化
printObjs(myObj, 10);

这样的代码会产生与你所设想不一样的执行结果。原因很简单,因为 Base` 与 ``Child 的结构不一样。也就是说 Base 对象与 Child 对象所占用的内存空间不一样。因此 Base 指针偏移也不同。这样将导致 Base 的指针运算不能正确地使用在 Child 对象上。而数组实际上就是指针操作,因此数组也不应该和多态一起使用。

__小结:__

  1. 基类的指针运算不能够正确地适用于派生类。
  2. 任何情况下都应该避免多态与指针运算共同使用。