在对数组进行传参使用多态时,程序会crash; 因为数组在移位至下一数据时,步长是形参(基类)的size,而不是指针实际指向数据类型(派生类)的size,所以会数组会移位至一个非法的地址。
详见下例:
详见下例:
有1点需要注意:如果Base和Derived类size大小一样(有相同的数据成员),不会crash。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void test()
{
cout<<"Base::test()"<<endl;
}
int a;
};
class Derived: public Base
{
public:
void test()
{
cout<<"Derived::test()"<<endl;
}
int b, c;
};
int testArray(Base bArray[], int n)
{
for(int i =0; i<n; i++)
bArray[i].test(); //i = 1时,程序crash; 编译器原先已经假设数组中元素与Base对象的大小一致,但是现在数组中每一个对象大小却与Derived一致,派生类的长度比基类要长,数组将移动到一个非法位置。
}
int main()
{
Base *p = new Derived[2];
testArray(p, 2);
}