C++类的构造顺序如下:
一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须始化后才执行其构造函数。
二、任何虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)
三、任何抽象基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)
四、任何非虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)
五、任何成员对象的构造函数按照它们声明的顺序构造
六、类自己的构造函数
#include <iostream>
#include <string>
using namespace std;
//抽象类AbstractClass(含有纯虚函数的类)
class AbstractClass
{
public:
AbstractClass()
{
cout<<"抽象类AbstractClass的构造函数"<<endl;
}
//纯虚函数fun
virtual void vrFun() = 0;
};
//虚基类VirtualBase
class VirtualBase
{
public:
VirtualBase()
{
cout<<"类VirtualBase的构造函数"<<endl;
}
};
//普通类CommonClass
class CommonBaseClass
{
public:
CommonBaseClass()
{
cout<<"类CommonBaseClass的构造函数"<<endl;
}
};
class CommonMemberClass
{
public:
CommonMemberClass()
{
cout<<"类CommonMemberClass的构造函数"<<endl;
}
};
//普通类StaticMemberClass
class StaticMemberClass
{
public:
StaticMemberClass()
{
cout<<"类StaticMemberClass的构造函数"<<endl;
}
};
//普通类StaticMemberClass
class StaticMemberClassNotInitial
{
public:
StaticMemberClassNotInitial()
{
cout<<"类StaticMemberClassNotInitial的构造函数"<<endl;
}
};
class ClassLocal: virtual public VirtualBase, public AbstractClass,public CommonBaseClass
{
public:
ClassLocal():VirtualBase(),AbstractClass(),CommonBaseClass()
{
cout<<"类ClassLocal的构造函数"<<endl;
}
void vrFun()
{
}
private:
CommonMemberClass m_CommonMemberClass;
static StaticMemberClass m_StaticMemberclass;
static StaticMemberClassNotInitial m_StaticMemberClassNotInitial;
};
StaticMemberClass ClassLocal::m_StaticMemberclass;
int main(int argc, char* argv[])
{
ClassLocal class_local;
return EXIT_SUCCESS;
}
输出结果:
类StaticMemberClass的构造函数
类VirtualBase的构造函数
抽象类AbstractClass的构造函数
类CommonBaseClass的构造函数
类CommonMemberClass的构造函数
类ClassLocal的构造函数
请按任意键继续. . .
构造顺序步骤:静态成员--虚基类---抽象类---基类--成员变量--类自身的构造函数