为什么`this`在子类中有不同的地址?

时间:2018-12-12 10:53:23

标签: c++

为什么d实例具有不同的this地址?有人告诉我,在OOP语言中,派生类只是基类的所有成员,其后是其自身的成员。

#include <iostream>
#include <memory>

struct A
{
    int member;
};

struct B : public virtual A
{
    void print_b() { std::cout << static_cast<void*>(this) << " " << static_cast<void*>(&this->member) << std::endl; }
};

struct C : public virtual A
{
    void print_c() { std::cout << static_cast<void*>(this) << " " << static_cast<void*>(std::addressof(member)) << std::endl; }
};

struct D : public B, public C 
{
    void print() 
    { 
        print_b();
        print_c();
    }
};

int main()
{
    D d;
    d.print();
}

Online outputs

  

0x700af9347b90 0x700af9347ba0

     

0x700af9347b98 0x700af9347ba0

1 个答案:

答案 0 :(得分:4)

由于BC基本子对象是彼此相对的对象,因此不能共享地址。

可以免除

Empty 基础子对象具有唯一地址的要求,但是BC不为空。