一.先看一段代码
class Parent {
public:
Parent(int a) {
this->a = a;
}
virtual void print() {
cout << "Parent::print a=" << a << endl;
}
int a;
};
class Child :public Parent {
public:
Child(int a) :Parent(a) {
}
virtual void print() {
cout << "Child::print a=" << a << endl;
}
};
int main() {
Child array[] = { Child(0),Child(1),Child(2) };
Parent* pp = &array[0];父指针指向孩子
Child* cp = &array[0];
pp->print();
cp->print();
cout << "--------------------" << endl;
pp++;
cp++;
pp->print();
cp->print();
cout << "--------------------" << endl;
int i = 0;
for (i, pp = &array[0]; i < 3; i++, pp++) {
pp->print();
}
}
运行结果:这里看似没有问题,可以正常输出。
二.修改代码
给class Child中增加一个变量b。
class Child :public Parent {
public:
int b;
Child(int a) :Parent(a) {
}
virtual void print() {
cout << "Child::print a=" << a << endl;
}
};
运行结果:结果直接裂开。
三.原理
如下图:pp是父类指针,pp+1向前走4个字节(由于父类中只有一个int a,每次+1相当于+sizeof(Parent)的空间大小),当Child中增加一个int变量b,此时pp指向了b0,所以无法输出。
四.总结
由此可以发现,如果想通过指针变量子类中元素,最好使用子类指针,而不要使用父类指针。