天天看點

C++多重繼承的構造與析構的順序C++多重繼承的構造與析構的次序

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)最後是那個虛基類