C++多重继承之成员变量的偏移量

在C++中,对类的成员变量取地址将得到该成员变量的偏移量,而不是在内存中的绝对地址,这个偏移量将和 this 指针中的地址一起构成其内存中的地址,比如在下面的代码中,类A有两个个int型成员变量 i、j ,那么 &A::i 和 &A::j 的值分别为 0 和 4;

class A {
public:
	int i,j;
};

在多重继承中,类可以同时继承于多个基类,每个基类都可能有自己的成员变量,众所周知,这些基类的子对象将在派生类对象的存储空间中依次排布,但是它们的偏移量会发生变化吗?这里涉及到一个存取这些成员变量的问题,下面我们以一个例子简要说明:


#include <cstdio>

class A {
public:
	int i,j;
};

class B {
public:
	int ii;
};

class C : public A,public B {
public:
	int iii;
};


int main()
{
	printf("addr of C::i = %d\naddr of C::j = %d\naddr of C::ii = %d\naddr of C::iii = %d\n",&C::i,&C::j,&C::ii,&C::iii);

	return 0;
}

在这段代码中,类A有两个int型成员变量 i、j,类B有一个int型成员变量 ii,类C多重继承于A和B,同时C也有自己的一个成员变量 iii,不难想象,在类A中,&A::i、&A::j 的值分别为0和4,在类B中,&B::ii 的值为 0,那么在类C中呢,&C::i、&C::j、&C::ii 的值分别为多少呢?下面是输出结果:

可以看到,ii 在C中的偏移量与在B中的偏移量是相同的,这就引发了我们的思考,因为 this指针是指向C类对象的首地址的,如果我们直接访问 ii,那么首地址+偏移量得到的并不是 ii 在内存中的正确位置,所以编译器在这里是做了些调整的,它会给this指针的值加8,以使其指向 B 类子对象,这样用调整后的this加上偏移量后就能正确访问 ii了。用一句话总结:在多重继承中,编译器会在适当的时候调整this指针的值,这种调整大多是透明的,不需要程序员操心。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值