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

原文地址:https://www.cnblogs.com/Chilly2015/p/5735986.html