C++中通过派生类调用第二基类的普通成员函数时this指针的调整

我们都知道,C++编译器对于普通的类成员函数的编译,会将其编译成非成员函数,即普通全局函数,并且对函数名进行name-mangling,加入this指针作为该函数的第一参数,这个this指针的类型是本类类型

class A

{

privagte:

    int mem;

public:

    int GetMem();

}


int A::GetMem()

{

    return mem;

}

经过编译后

成员函数GetMem变为类似这样的形式:

int GetMem_A_F0()

{

         return this->mem;

}


那么,问题来了

如果

class C : public B,A

{
}


A不是第一基类,那么

C* pC = new C();

pC->GetMem();

第二行函数 调用到A中的GetMem时,如果this指针是pC,那么pC->mem能正常工作吗?

因为pC->mem编译完后,代码类似于

*(pC + &A::mem);

&A::men返回的是mem在一个A类型对象中对于首地址的偏移量,但是pC并不是A类型对象的首地址,因此,直接从C类型对象的首地址加上men的偏移量是无法访问到mem成员的。

因此,这里是需要进行this转换的

转换发生在使用C类型指针调用A成员函数时,由于该成员函数的this指针参数是A×

因此,编译器应该会做如下操作

A* pA_tmp = pC;  //这里会发生指针调整,pA = pC + sizeof(B);

GetMem_A_F0(pA_tmp);

这个也是我猜到,否则编译器凭什么依据去调整这个指针呢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值