经测试按照如下顺序:
一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才执行其构造函数。
二、任何虚拟继承基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)
三、任何非虚拟继承基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)
四、任何成员对象的构造函数按照它们声明的顺序构造
五、类自己的构造函数
测试程序如下:
[cpp]
view plain
copy
- #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; -
} - };
-
- //普通类C
- class
E - {
- public:
-
E() -
{ -
cout<<"类E的构造函数"<<endl; -
} - };
-
- //普通类D
- class
F - {
- public:
-
F() -
{ -
cout<<"类F的构造函数"<<endl; -
} - };
-
- //普通类D
- class
G - {
- public:
-
G() -
{ -
cout<<"类G的构造函数"<<endl; -
} - };
-
- //普通类D
- class
H - {
- public:
-
H() -
{ -
cout<<"类H的构造函数"<<endl; -
} - };
- //普通类D
- class
M - {
- public:
-
M() -
{ -
cout<<"类M的构造函数"<<endl; -
} - };
-
- class
Test: public A,public B,virtual public C,virtual public D,public E,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; -
return EXIT_SUCCESS; - }
类C的构造函数 (虚拟继承基类)
类D的构造函数
抽象类A的构造函数 ( 非虚拟继承基类)
抽象类B的构造函数
类E的构造函数
类F的构造函数
类G的构造函数 (普通成员对象构造)
类Test的构造函数 (派生类自己构造函数)