c++中类的内存分布

#include <iostream>
using namespace std;


class A{
public:
long a;
};
class B : public A {
public:
long b;
};
void seta(A* data, int idx) { 
data[idx].a = 2; 
}

int main(int argc, char *argv[]) {
B data[4];
for (int i = 0; i < 4; ++i){
data[i].a = 1;
data[i].b = 1;
seta(data, i); //考察类的内存分布,记住了,先是类的首地址,然后成员变量依次在内存中进行存储。
}
for (int i = 0; i < 4; ++i){
std::cout << data[i].a << data[i].b;
}
return 0;
}

这里输出应该是22221111。

此题考查的是类的内存分布。

对单个类来说是在内存中的分布是先存放类的首地址,然后依次存放类的成员变量和成员函数,并满足对齐原则。

如果是有继承,则对基类来说是先存放基类的成员变量,然后再存放子类的成员变量,

void seta(A* data, int idx) { 
data[idx].a = 2; 
}

把data指针转换成了A,变成了父类,然后类的内存分布是依次先排父类的成员变量,再排子类的成员变量。

这里基类只有一个成员变量a,但是内存中分布是abababab,这样子的,所以循环4次,依次进行4次赋值,所以输出22221111.

如果是

void seta(B* data, int idx) { //
data[idx].a = 2;
}

如果这里不进行类别转换,仍然是子类的指针,那么这时候会只对a成员变量进行赋值,不会对子类的b成员变量赋值,输出就会变21212121.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值