关于#虚基类#的问题,如何解决?

请问这个程序跑出来,为什么结果是0,谢谢!
是不是因为在虚基类中,对于对象的基类默认初始化,使用的值是基类构造函数缺省的,谢谢!

#include<iostream>
using namespace std;

class Base {
protected:
    int b;
public:
    Base(int b = 0) :b(b) { }
};

class Base1 :virtual public Base {
public:
    Base1(int b):Base(b) { }
};

class Base2 :virtual public Base {
public:
    Base2(int b):Base(b){ }
};

class Derived :public Base1, public Base2 {
public:
    Derived(int b):Base1(b),Base2(b){ }
    void show() { 
        cout << b << endl;
    }
};

int main() {
    Derived d(2); d.show(); return 0;
}

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。