C++中通过派生类调用第二基类的普通成员函数时this指针的调整
2017-05-26 21:28
731 查看
我们都知道,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);
这个也是我猜到,否则编译器凭什么依据去调整这个指针呢
即
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);
这个也是我猜到,否则编译器凭什么依据去调整这个指针呢
相关文章推荐
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- 函数调用约定(注意c++普通函数成员调用时有this参数)
- 派生类中基类成员函数的this指针
- C++调用一个成员函数的需求this指针的情况
- C++成员函数 this指针 调用约定
- c++ 如何把this指针传入成员函数 像全局函数一样调用成员函数
- C++中的成员函数调用原理及this指针的传递方式
- C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765
- 基类子类的this指针相同,但在基类函数永远调用基类的成员变量
- C++调用成员函数需要this指针的情况
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)
- 使用类成员函数指针调用C++成员函数的一种方式
- 转:关于在C++内用指针调用类的成员函数
- 使用纯C函数指针调用C++的类成员函数
- 通过一个非法的指针或者NULL指针调用成员函数会发生什么?
- C++关于this指针、静态变量和静态成员函数 http://www.cnblogs.com/clrmas/archive/2010/03/23/1692893.htm