虚基类的派生类构造函数的执行顺序

#include
using namespace std;
class Base//声明基类base 
{
	public:
		Base(int sa)
		{
			a=sa;
			cout<<"Constructing Base"<<endl;
		}
	private:
		int a;
};
class Base1:virtual public Base//声明类base是base1的虚基类 
{
	public:
		Base1(int sa,int sb):Base(sa)//在此必须缀上对类base的构造函数的调用 
		{
			b=sb;
			cout<<"Constructing Base1"<<endl;
		}
	private:
		int b;
};
class Base2:virtual public Base//声明base是base2的虚基类 
{
	public:
		Base2(int sa,int sc):Base(sa)//在此2必须缀上对类base构造函数的调用 
		{
			c=sc;
			cout<<"Constructing Base2"<<endl;
		}
	private:
		int c;
};
class Derived:public Base1,public Base2//derived是base1和base2的共同派生类是base的间接派生类 
{
	public:
		Derived(int sa,int sb,int sc,int sd):Base(sa),Base1(sa,sb),Base2(sa,sc)//在此必须缀上对类base的构造函数的调用 
		{
			d=sd;
			cout<<"Constructing Derived"<<endl;
		}
	private:
		int d;
};
int main()
{
	Derived obj(2,4,6,8);
	return 0;
}
  • 在上述程序中,base是一个虚基类,他只有一个带参数的构造函数,因此要求在派生类base1和base2和derived的构造函数的初始化列表中,都必须带有对类base构造函数的调用。

  • 如果base不是虚基类在derived构造函数的初始化列表中调用base的构造函数就是错误的。

  • 当base是虚基类且只有带参数的构造函数时,就必须在类derived的构造函数的初始化列表中调用base的构造函数。

  • 不难看出,上述程序中虚基类base的构造函数只执行了一次。显然当derived的构造函数调用了虚基类base的构造函数之后,类base1和类base2对base构造函数的调用就被忽略了

你可能感兴趣的:(虚基类的派生类构造函数的执行顺序)