????????????????????????????????????л??????????????????????????????????????????????????????н??????Ρ????????????????????4???н??????ж??????B1??B2?????????V1??V2??V3??????????D1??D2.?????X????D1????V1??D2????V2????D1??D2??????????V1??????????V2.??V2????????У?B1????B2.????????????????????????????????????D1??D2.???????????????????????????????????????????????????й????????????????????????????

????B1::B1()!<
????V1::V1()!<
????B1::B1()!<
????B2::B2()!<
????V2::V2()!<
????D1::D1()!<
????B3::B3()!<
????D2::D2()!<
????M1::M1()!<
????M2::M2()!<

?????????????????乹????????????????????????????У????????B1????????????????а?????????virtual??е??μ?????????????B1??Σ??????virtual???????B1?????????????

class B1
{
public:
    B1(){cout<<"B1::B1()!<"<<endl;}
    void f() {cout<<"i'm here!"<<endl;}
};

class V1: virtual public B1   //public????virtual
{
public:
    V1(){cout<<"V1::V1()!<"<<endl;}
};

class D1:  public V1
{
public:
    D1(){cout<<"D1::D1()!<"<<endl;}
};

class B2
{
public:
    B2(){cout<<"B2::B2()!<"<<endl;}
};

class B3
{
public:
    B3(){cout<<"B3::B3()!<"<<endl;}
};

class V2:virtual public B1?? public B2 //public B1????virtual public B1
{
public:
    V2(){cout<<"V2::V2()!<"<<endl;}
};

class D2: public V2?? public B3
{
public:
    D2(){cout<<"D2::D2()!<"<<endl;}
};

class M1
{
public:
    M1(){cout<<"M1::M1()!<"<<endl;}
};

class M2
{
public:
    M2(){cout<<"M2::M2()!<"<<endl;}
};

class X:public D1?? public D2
{
    M1 m1;
    M2 m2;
};