虚基类和初始化列表

bav*_*aza 3 c++ virtual inheritance

可能重复:
gcc c ++虚拟继承问题

大家好,

我想知道在使用虚拟基类的多重继承时编译器如何处理不同的初始化值.考虑臭名昭着的"恐惧钻石"继承计划:

     Base
     / \
    /   \
  D1     D2
    \   /
     \ /
     Join
Run Code Online (Sandbox Code Playgroud)

为了避免使用Basein的两个副本Join,我使用虚拟继承D1D2(参见例如此处).现在,假设Base不是抽象的,但有一个成员字段,在其构造函数中初始化:

class Base { 
public:
    Base(int x_) {x = x_;};
    virtual ~Base(){};

public:
    int x;
};

class D1 : public virtual Base {
public:
    D1() : Base(1) {};
    virtual ~D1(){};
};

class D2 : public virtual Base {
public:
    D2() : Base(2) {};
    virtual ~D2(){};
};

class Join : public D1, public D2 {
public:
    Join(){};
    ~Join(){};
};

int main()
{
   Join j;
   cout << j.x << endl;

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

输出是1,2还是依赖于编译器?

CB *_*ley 5

它不应该编译.虚拟基础由最派生的类初始化,即Join.Join没有显式初始化BaseBase没有可访问的默认构造函数.

[它也不会编译,因为类的定义需要以a终止,;但我认为这是一个错字.main也应该回来int,我认为这j.x是一个错字j->x.]