多重继承中的内存布局

memory layout in multiple inheritance

#include <iostream>
using namespace std;

struct Left
{
   char i = 'k';
};

struct Right
{
   int a = 99;
};

class Bottom : public Left, public Right
{};

int main()
{
    Bottom b;

    Left l = b;
    cout << l.i;

    Right r = b;
    cout << r.a;

    return 0;    
}
// output
// k99

这是怎么做到的?

如果Bottom的内存布局是:

Left
Right
Bottom

然后将b(即Bottom)切片到Left对象,应该可以,但是当我将Bottom切片到[=16=时,它如何工作? ] 对象?

注意:如果我使用转换,这一切都可以。但是我没有。

BottomRightLeft是一个正确的转换,而不仅仅是切片。编译器使用 Bottom 中子对象的正确偏移量生成代码。

这个 Dr.Dobbs article 您应该会感兴趣。