我们都知道,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);
这个也是我猜到,否则编译器凭什么依据去调整这个指针呢