#include
using namespace std;
class base
{
public:
base()
{
cout << "调用无参构造" << endl;
}
base(int a)
{
cout << a << "调用有参构造" << endl;
}
};
class b1 :virtual public base
{
public:
b1()
{
cout << "b1的无参函数函数被调用" << endl;
}
b1(int a, int b = 0):base(b)
{
cout << a;
cout << "调用派生有参构造" << endl;
}
};
class b2 :public b1
{
public:
b2(int a, int b) :by(a), base(b)
{
cout << "最终函数调用" << endl;
}
private:
b1 B1;
base by;
};
int main()
{
b2 d(1,2);
return 0;
}
b2 d(1,2);进入b2的构造函数,因为b2继承自b1,但是b2的构造函数没有显示调用b1的构造函数,因此,b2默认调用b1的无参构造函数。b1虚继承base,b2的构造函数中调用base的带参构造函数,因此,首先输出的是base的带参构造函数(因为b1也要调用base的构造函数,因此,base的构造函数先输出,)具体如下图所示:
先调用b2,因为base(b),进入base带参构造,再进入b1无参构造,1、2行输出;
这时,对b2私有变量b1构造,进入base无参构造,进入b1无参构造,3、4输出;
再进入b2私有成员变量by,因为by(a),a=1,进入有参的base的构造,5输出;
最后再执行b2的构造,6行输出。结束。