C++:理解"this"指针

ash*_*ash 7 c++ pointers this

我想了解"这个"指针.我认为"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)

了解这一点有任何帮助.

谢谢.

eer*_*ika 6

我认为"this"指针指的是类对象的值.

正确.this始终指向调用成员函数的对象.

我可以看到"this"指针的不同值

哦,但你不打印this(in globalAglobalB).你的打印obj甚至没有相同的类型this.

this是类型的concrete*.当您将其传递给采用类型参数的函数时,InterfaceB*指针将隐式转换为另一种类型.允许转换因为interfaceB是基础concrete.转换后的指针将不再指向this对象,而是指向基类子对象.子对象(基类实例或成员)可能但可能与主对象的地址不同.对象的子对象不能共享地址,因此最多只有一个子对象可以具有与主对象相同的地址 - 除了空基优化的情况.