C++多重繼承的構造與析構的次序
在C++的多重繼承中含有虛基類,成員對象時很容易把構造與析構的順序弄不清楚
下面看一段代碼
#include <iostream>
using namespace std;
class OBJ1
{
public:
OBJ1()
{
cout<<"OBJ1"<<endl;
}
~OBJ1()
{
cout<<"~OBJ1"<<endl;
}
};
class OBJ2
{
public:
OBJ2()
{
cout<<"OBJ2"<<endl;
}
~OBJ2()
{
cout<<"~OBJ2"<<endl;
}
};
class Base1
{
public:
Base1()
{
cout<<"Base1"<<endl;
}
~Base1()
{
cout<<"~Base1"<<endl;
}
};
class Base2
{
public:
Base2()
{
cout<<"Base2"<<endl;
}
~Base2()
{
cout<<"~Base2"<<endl;
}
};
class Base3
{
public:
Base3()
{
cout<<"Base3"<<endl;
}
~Base3()
{
cout<<"~Base3"<<endl;
}
};
class Base4
{
public:
Base4()
{
cout<<"Base4"<<endl;
}
~Base4()
{
cout<<"~Base4"<<endl;
}
};
class Derived: public Base1, virtual public Base2, public Base3, virtual public Base4
{
public:
Derived():Base4(),Base3(),Base2(),Base1(),obj2(),obj1(){}
protected:
OBJ1 obj1;
OBJ2 obj2;
};
int main()
{
Derived aa;
return 0;
}
運作結果
Base2
Base4
Base1
Base3
OBJ1
OBJ2
~OBJ2
~OBJ1
~Base3
~Base1
~Base4
~Base2
Program ended with exit code: 0
由此可知C++中多重繼承的構造順序是
1)虛函數優先構造,其順序是按那個繼承的順序來的,而不是按初始化清單來的
2)然後構造普通的基類,其順序也是按那個繼承的順序來的,不是按初始化清單來的
3)最後構造成員對象
4)構造派生類自己的函數體
由此可知C++中多重繼承的析構順序是
1)構造派生類自己的函數體
2)析造成員對象
3)然後析構普通的基類,其順序也是按那個繼承的順序來的,也不是按初始化清單來的
4)最後是那個虛基類