下面示例就是說明多重繼承析構函數和構造函數的執行順序:
#include <iostream>
using namespace std;
class A {
public:
A(int i)
{
cout << "父類A構造函數被調用:" << i<<endl;
}
virtual ~A()
{
cout << "父類A虛構函數被調用:" << endl;
}
};
class B {
public:
B(int i)
{
cout << "父類B構造函數被調用:" <<i<< endl;
}
virtual ~B()
{
cout << "父類B虛構函數被調用:" << endl;
}
};
class C : public A, virtual public B
{
public:
C(int i,int j,int k,int l):A(l),B(i),b1(j),a(k)
{
cout << "C子類構造函數被調用" << endl;
}
~C()
{
cout << "C子類虛構函數被調用:" << endl;
}
A a;
B b1;
};
int main()
{
cout << "B類是C類的虛基類,A類是C類的非虛基類" << endl;
cout << "----------下面是執行順序------------" << endl;
A *pa = new C(1,2,3,4);
delete pa;
system("PAUSE");
return(0);
}
運行結果:
結論:
繼承構造函數的執行順序是:先基類,再子對象成員,最後是派生類。析構函數則與之相反。當多重繼承時,如有繼承虛基類,那麼構造的順序是,虛基類先於非虛基類。再就是,子對象成員的構造順序跟它們的聲明順序有關,跟初始化參數列表無關。
注:
1、虛基類的作用是消除二義性
2、當父類指針指向子類對象,如果基類的析構函數不是虛析構函數,那麼釋放對象時不會執行派生類析構函數,virtual ~Base() { cout << “Base Destructor”<<endl; }即可執行派生類的析構函數。