仅具有一个基本虚拟的多路径继承

Bij*_*gmi 3 c++ inheritance multipath

据我所知,virtual 确保只有基类属性的一份副本被继承到派生类。在多重继承中,首先调用所有基类的构造函数,然后调用派生类的构造函数。下面的代码中为什么连续调用了B类的构造函数两次?据我了解,输出应该是

B
B1
B2
D
Run Code Online (Sandbox Code Playgroud)

但输出结果是

B
B
B1
B2
D
Run Code Online (Sandbox Code Playgroud)

这是完整的代码。

#include <iostream>

class B
{
public:
    B(){std::cout << "B" << std::endl;}
};

class B1:public B
{
public:
    B1(){std::cout << "B1" << std::endl;}
};

class B2:virtual public B
{
public:
    B2(){std::cout << "B2" << std::endl;}
};

class D:public B1, public B2
{
public:
    D(){std::cout << "D" << std::endl;}
};

int main()
{
    D d1;
}
Run Code Online (Sandbox Code Playgroud)

Jul*_*ARD 5

B1 对 B 的继承也必须是虚拟的。

虚拟继承并不意味着“在层次结构的其余部分中查找此类的继承实例”,它意味着“对该层次结构中的所有虚拟继承仅使用一个继承实例”。