gcc 4.5.1虚拟继承问题

Kam*_*l_H 6 c++ virtual-inheritance

让我们从代码片段开始:

#include <iostream>

struct God{
    God(){_test = 8;}
    virtual ~God(){}
    int _test;
};

struct Base1 : public virtual God{
    //Base1(){std::cout << "Base1::Base1" << std::endl;}  //enable this line to fix problem
    virtual ~Base1(){}
};

struct Base2 : public virtual Base1{
    virtual ~Base2(){}
};

struct A1 : public virtual Base2{
    A1(){std::cout << "A1:A1()" << std::endl;}
    virtual ~A1(){};
};

struct A2 : public virtual Base2{
    A2(){std::cout << "A2:A2()" << std::endl;}
    virtual ~A2(){};
};


struct Derived: public virtual A1, public virtual A2{
    Derived():Base1(){std::cout << "Derived::Derived()" << std::endl;}
    Derived(int i){std::cout << "Derived(i)::Derived(i)" << std::endl;}         
    virtual ~Derived(){}
};


int main(){

    God* b1 = new Derived();
    std::cout << b1->_test << std::endl;    //why it prints 0?

    God* b2 = new Derived(5);
    std::cout << b2->_test << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用GCC 4.5.1和4.6.1编译Derived类的构造函数之间的唯一区别是第一个明确说明应该调用哪个Base1构造函数.我希望两个cout在main()打印8.不幸的是第一个打印0!.

为什么?

如果我启用Base1构造函数的显式定义,它会解决问题.如果我在Derived类定义(类Derived:public A1,public A2)中删除虚拟继承,它也可以工作.这是预期的行为吗?

根据GCC 3.4.4或Microsoft编译器(VS)无法观察到该问题

ras*_*mus 1

这一定是编译器错误。我还测试了GCC 4.2.1,两种情况的结果都是8。