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

时间:2021-12-26 20:01:50

我们都知道,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);

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