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的时候,都会产生不可预期的错误
简单的说,大家需要注意的一点就是,数组不要和多态进行混合使用,因为数组总是会涉及指针
的算术运算。
当然这个也不是绝对的,都是内存访问惹的祸
如果你能够避免一个具象类(带有参数的类)继承自另外的一个具象类,你就不太能犯
下这样的错误。
具体的内容我晚上在下一篇随笔里面进行介绍