我想了解"这个"指针.我认为"this"指针指的是类对象的值.但是,在下面的代码中,我可以看到"this"指针的不同值:
#include <stdio.h>
class InterfaceA{
public:
virtual void funa() = 0;
};
class InterfaceB{
public:
virtual void funb() = 0;
};
void globala(InterfaceA* obj){
printf("globalA: pointer: %p\n\r",obj);
}
void globalb(InterfaceB* obj){
printf("globalB: pointer: %p\n\r",obj);
}
class concrete : public InterfaceA, public InterfaceB{
public:
void funa(){
printf("funa: pointer: %p\n\r",this);
globala(this);
globalb(this);
}
void funb(){
printf("funb: pointer: %p\n\r",this);
globala(this);
globalb(this);
}
};
int main(int argc, char *argv[])
{
concrete ac;
ac.funa();
ac.funb();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该计划的输出给出:
funa: pointer: 0x7ffff67261a0
globalA: pointer: 0x7ffff67261a0
globalB: pointer: 0x7ffff67261a8
funb: pointer: 0x7ffff67261a0
globalA: pointer: 0x7ffff67261a0
globalB: pointer: 0x7ffff67261a8
Run Code Online (Sandbox Code Playgroud)
了解这一点有任何帮助.
谢谢.
我认为"this"指针指的是类对象的值.
正确.this始终指向调用成员函数的对象.
我可以看到"this"指针的不同值
哦,但你不打印this(in globalA和globalB).你的打印obj甚至没有相同的类型this.
this是类型的concrete*.当您将其传递给采用类型参数的函数时,InterfaceB*指针将隐式转换为另一种类型.允许转换因为interfaceB是基础concrete.转换后的指针将不再指向this对象,而是指向基类子对象.子对象(基类实例或成员)可能但可能与主对象的地址不同.对象的子对象不能共享地址,因此最多只有一个子对象可以具有与主对象相同的地址 - 除了空基优化的情况.