今天写球球大战游戏的时候,用类对代码进行重构,发现一个容易出错的地方,写了一个测试程序。
#include<iostream>
using namespace std;
class Base {
public:
int baseInt;
char baseChar;
virtual void test() = 0;
};
class Son :public Base {
public:
int sonInt1;
int sonInt2;
void test() {
cout << "this is test for son" << endl;
}
};
void myTest(Base* base) {
base[1].baseInt = 5;
base[1].baseChar = 'a';
}
int main()
{
Son a[5];
for (int i = 0; i < 5; i++) {
a[i].baseChar = 'a' + i;
a[i].baseInt = i;
a[i].sonInt1 = 10 + i;
a[i].sonInt2 = 100 + i;
}
myTest(a);
}
将子类数组son a[]传递给函数时,我们看a[0] a[1] a[2]首地址
进入到函数内部
发现他们的地址压根不一样,写base[1]会修改a[0]的数据,就像计算机系统的多个未定义的全局变量一样,会任选一个,覆盖后面的。