当base具有虚函数时,静态强制转换为基类会产生意外结果

时间:2018-03-17 18:53:24

标签: c++ inheritance multiple-inheritance virtual-functions memory-layout

struct Base1{

    int b1[100];

};

struct Base2{

    int b2;

    virtual void foo() {}

};

struct Derived : public Base1, public Base2{

    int d;

};

int main(){

    Derived D;
    Base2* p_B2 = &D;

    std::cout << &D << "\n";
    std::cout << p_B2 << "\n";

    std::cout << sizeof( D) << "\n";
    std::cout << sizeof( *p_B2) << "\n";

    std::cout << &(D.b2) << "\n";
    std::cout << &(p_B2->b2) << "\n";

    return 0;

}

如果虚拟功能被注释掉,输出类似于:

0x7fffffffdcb0
0x7fffffffde40
408
4
0x7fffffffde40
0x7fffffffde40

如果存在虚函数,则输出为:

0x7fffffffdca0
0x7fffffffdca0
416
16
0x7fffffffdca8
0x7fffffffdca8

大小差异是v指针+填充,但偏移在哪里?为什么那些指向同一个地址?为什么在它们之间应该至少有100个int-s时,D和D.b2之间只有8个字节(我假设的v指针)差异?

(另外我的调试器(gdb)将p_B2显示为&#34;派生&#34;类型。)

1 个答案:

答案 0 :(得分:3)

编译器可以随意布置你喜欢的类,大概是你的编译器总是将虚拟类放在开头,然后是任何非虚拟类。

您不能依赖任何特定的课程排序。