#include<iostream>
using namespace std;
class B1
{
public:
B1()
{
cout << "call B1" << endl;
}
};
class V1 : public B1
{
public:
V1()
{
cout << "call V1" << endl;
}
~V1()
{
cout << "call ~V1" << endl;
}
};
class D1 : virtual public V1
{
public:
D1()
{
cout << "call D1" << endl;
}
~D1()
{
cout << "call ~D1" << endl;
}
};
class B2
{
public:
B2()
{
cout << "call B2" << endl;
}
~B2()
{
cout << "call ~B2" << endl;
}
};
class B3
{
public:
B3()
{
cout << "call B3" << endl;
}
~B3()
{
cout << "call ~B3" << endl;
}
};
class V2 : public B1, public B2
{
public:
V2()
{
cout << "call V2" << endl;
}
~V2()
{
cout << "call ~V2" << endl;
}
};
class D2 : virtual public V2 ,public B3
{
public:
D2()
{
cout << "call D2" << endl;
}
~D2()
{
cout << "call ~D2" << endl;
}
};
class M1
{
public:
M1()
{
cout << "call M1" << endl;
}
~M1()
{
cout << "call ~M1" << endl;
}
};
class M2
{
public:
M2()
{
cout << "call M2" << endl;
}
~M2()
{
cout << "call ~M2" << endl;
}
};
class X : public D1,public D2
{
public:
X()
{
cout << "call X" << endl;
}
~X()
{
cout << "call ~X" << endl;
}
M1 m1_;
M2 m2_;
};
void main()
{
X b;
}
输出:
call B1
call V1
call B1
call B2
call V2
call D1
call B3
call D2
call M1
call M2
call X
析构函数于此相反。
X对象各子对象的构造顺序如下:
1.首先:构造虚基子类对象:
构造V1:B1::B1()V1::V1()
构造V2:B1::B1() B2::B2() V2::V2()
2.其次,构造非虚基类子对象:
构造 D1:D1::D1()
构造 D2:B3::B3() D2::D2()
3.再次,构造所有成员:
M1::M1()
M2::M2()
4. 构造X本身:
X::X()