C++ 本文件的参考地址与本文件不同

C++ 本文件的参考地址与本文件不同,c++,pointers,reference,C++,Pointers,Reference,我有以下代码片段: class Base { //... }; class Subclass : public Base { public: void foo() { Base& ref = (*this); } //... }; 在这里,我将此引用传递给其他一些对象的构造函数,以供以后使用。根据下面的文章(以及我对参考文献的了解),如果我得到ref的地址,它应该与此相同 但是,这是我运行代码时看到的: this 0x20002288 &am

我有以下代码片段:

class Base {
//...
};

class Subclass : public Base {
public:
    void foo() {
        Base& ref = (*this);
    }
//...
};
在这里,我将此引用传递给其他一些对象的构造函数,以供以后使用。根据下面的文章(以及我对参考文献的了解),如果我得到ref的地址,它应该与此相同

但是,这是我运行代码时看到的:

this    0x20002288 
&ref    0x20003314
地址不一样。有人知道为什么会这样吗


谢谢

我找到了问题的根源,它与多重继承有关。以下是一个简化的示例:

#include <stdio.h>

class Base1 {
private:
    int _a;
    int _b;
};

class Base2 {
public:
    ~Base2() {
        
    }
    
    virtual void* foo() = 0;
    
private:
    int _x;
};

class Child : public Base1, public Base2 {
public:
    void* foo() override {
        Base1& baseRef = (*this);
        return static_cast<void*>(&baseRef);
    }

private:
    int _c;
};

int main() {
    Child c;

    printf("&c=%p\r\n",&c);
    printf("c.foo()=%p\r\n",c.foo());
    
    Base2* c2 = new Child;
    
    printf("c2=%p\r\n",c2);
    printf("c2->foo()=%p\r\n",c2->foo());

    return 0;
}

我找到了问题的根源,它与多重继承有关。以下是一个简化的示例:

#include <stdio.h>

class Base1 {
private:
    int _a;
    int _b;
};

class Base2 {
public:
    ~Base2() {
        
    }
    
    virtual void* foo() = 0;
    
private:
    int _x;
};

class Child : public Base1, public Base2 {
public:
    void* foo() override {
        Base1& baseRef = (*this);
        return static_cast<void*>(&baseRef);
    }

private:
    int _c;
};

int main() {
    Child c;

    printf("&c=%p\r\n",&c);
    printf("c.foo()=%p\r\n",c.foo());
    
    Base2* c2 = new Child;
    
    printf("c2=%p\r\n",c2);
    printf("c2->foo()=%p\r\n",c2->foo());

    return 0;
}

引用有时只是同一对象的不同名称,有时是经过所有用法传递到引用对象的实际对象(你在问题中的设置方式让我觉得还有更多。请做一个。如果你愿意,你可以在此基础上继续。@MooingDuck你能详细说明一下吗?如果我的引用不仅仅是“this”的一个不同名称,那么它到底指的是什么?子类本身?我的意思是,你正在将继承引入混合,妈妈ybe vtables。你没有显示足够的代码。比如你是如何获得输出的。@TedLyngmo就在你这么说的时候,我想知道我的问题是否是因为我正在测试的真正的类使用了多重继承…引用有时只是同一个对象的不同名称,有时它们是通过t的实际对象hr通过对引用对象的所有用法:(你在问题中的设置方式让我觉得还有更多。请做一个。如果你愿意,你可以在此基础上继续。@MooingDuck你能详细说明一下吗?如果我的引用不仅仅是“this”的一个不同名称,那么它到底指的是什么?子类本身?我的意思是,你正在将继承引入混合,妈妈ybe vtables。你没有显示足够的代码。比如你是如何获得输出的。@TedLyngmo你这么说,我想知道我的问题是否是因为我正在测试的真正类使用多重继承的事实。。。