不要使用polymorphically方式处理数组

不要使用polymorphically方式处理数组

inheritance的重要性质就是你可以通过指向base class objects的pointers或者references来操作derived class object.

同样C++也允许你使用pointers或者references来操作derived class object形成的数组。但是这样的行为很危险,几乎不会按你设定的方式运作。

我们来举个例子:

  class  A {} ;
  class  B: public  A {} ;

  // 现在我们有一个函数
void  printAArray(ostream &  s, const  A array[], int  numElement)
{
   
    for(int i=0;i<numElement;++i)
      
{
            s
<<array[i];//假设A objects中有一个operator<<可以用 
 
     }

}


当你把A AArray[10];传给他
...
printAArray(cout,AArray,10);//运作良好

但是当你把B BArray传给他
printAArray(cout,BArray,10);//还能正常运作吗

毫无疑问,编译时编译器会很开心的接受他。但是运行时呢
  for ( int  i = 0 ;i < numElement; ++ i)
  
{
            s
<<array[i];//假设A objects中有一个operator<<可以用 
 
}
就会出问题,array所指向的内存和array+i所指向的内存有多远的距离
答案是i*sizeof(A),但是我们在穿BArray的时候我们需要的是i*sizeof(B),因为
derived class object通常比base class object 大。

同样你通过bass class来删除derived class object的时候,都会产生不可预期的错误

简单的说,大家需要注意的一点就是,数组不要和多态进行混合使用,因为数组总是会涉及指针
的算术运算。

当然这个也不是绝对的,都是内存访问惹的祸

如果你能够避免一个具象类(带有参数的类)继承自另外的一个具象类,你就不太能犯
下这样的错误。

具体的内容我晚上在下一篇随笔里面进行介绍

你可能感兴趣的:(不要使用polymorphically方式处理数组)