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)最后是那个虚基类