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類的構造函數被調用。