C++中構造函數順序

C++中構造函數的順序問題。

靜態成員 》 虛基類 》 普通基類 》 數據成員 》 子類構造函數。

先看代碼:

#include <iostream>
#include <string>
using namespace std;

//抽象類A
class A
{
public:
	A()
	{
		cout<<"抽象類A的構造函數"<<endl;
	}
	//純虛函數fun
	virtual void fun1() = 0;
};

//抽象類B
class B
{
public:
	B()
	{
		cout<<"抽象類B的構造函數"<<endl;
	}
	//純虛函數fun
	virtual void fun2() = 0;
};

//普通類C
class C
{
public:
	C()
	{
		cout<<"類C的構造函數"<<endl;
	}
};

//普通類D
class D
{
public:
	D()
	{
		cout<<"類D的構造函數"<<endl;
	}
};

//普通類E
class E
{
public:
	E()
	{
		cout<<"類E的構造函數"<<endl;
	}
};

//普通類F
class F
{
public:
	F()
	{
		cout<<"類F的構造函數"<<endl;
	}
};

//普通類F
class G
{
public:
	G()
	{
		cout<<"類G的構造函數"<<endl;
	}
};

//普通類H
class H
{
public:
	H()
	{
		cout<<"類H的構造函數"<<endl;
	}
};
//普通類M
class M
{
public:
	M()
	{
		cout<<"類M的構造函數"<<endl;
	}
};

class Test: public E,public B,virtual public C,virtual public D,public A,public F
{
public:
	Test():B(),A(),D(),C(),F(),E()
	{
		cout<<"類Test的構造函數"<<endl;
	}
	void fun1()
	{
	}
	void fun2()
	{
	}
private:
	G g;
	static H h;
	static M m;
};

H Test::h;

int main(int argc, char* argv[])
{
	Test test;
	system("pause");
	return EXIT_SUCCESS;
}

靜態成員M,因爲沒有初始化,所以不會調用構造函數。

虛基類C D緊接着被構造。

基類EBAF按照繼承的順序被構造,這個順序與初始化列表中的順序無關。

對象成員G被構造

Test類的構造函數被調用。

發佈了29 篇原創文章 · 獲贊 32 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章