C++ 函数形参发生动态绑定时指针增长步长与静态类型一致
牛客网上的题:
class A { public: long a; }; class B : public A { public: long b; }; void seta1(A* data, int idx) { data[idx].a = 2; } void seta2(A* data, int idx) { data[idx].a = 2; } int main() { B data[4]; for (int i = 0; i<4; ++i) { data[i].a = 1; data[i].b = 1; seta1(data, i); //输出22221111 //seta2(data, i); //输出21212121 } for (int i = 0; i<4; ++i) { std::cout << data[i].a << data[i].b; } return 0; }
这个题中,A的大小为4,B的大小为8,seta1的形参是A类型指针,seta2的形参是B类型指针
所以seta1内部的步长增长是4,seta2内部的步长增长是8,当seta1和seta2的实参是B类型时在赋值时发生:
所以:
seta1的输出是22221111
seta2的输出是21212121