构建一个类的对象的一般顺序
- 如果该类有直接或者间接的虚基类,则先执行虚基类的构造函数。
- 如果该类有其他基类,则按照它们在继承声明的列表中出现的次序,分别执行它们的构造函数,但构造过程中,不在执行它们基类的构造函数。
- 按照在类定义中出现的顺序,对派生类中新增的成员对象进行初始化。对于类类型的成员对象,如果出现在构造函数初始化列表中,则以其中指定的参数执行构造函数。如果未出现,则执行默认构造函数;对于基本数据类型的成员对象,如果出现在构造函数的初始化列表中,则使用其中指定的值为其赋初值,否则什么页不做。
- 执行构造函数的函数体。
验证过程
- 如果该类有直接或者间接的虚基类,则先执行虚基类的构造函数。
- 如果该类有其他基类,则按照它们在继承声明的列表中出现的次序,分别执行它们的构造函数,但构造过程中,不在执行它们基类的构造函数。
class Abase
{
public:
Abase()
{cout<<"Abase"<<endl; }
~Abase()
{cout<<"~Abase"<<endl;}
};
class Bbase
{
public:
Bbase()
{ cout<<"Bbase"<<endl; }
~Bbase()
{ cout<<"~Bbase"<<endl;}
};
class CCbase
{
public:
CCbase()
{cout<<"CCbase"<<endl;}
~CCbase()
{ cout<<"~CCbase"<<endl; }
};
class Cbase:virtual public CCbase
{
public:
Cbase()
{cout<<"Cbase"<<endl; }
~Cbase()
{cout<<"~Cbase"<<endl;}
};
class Dbase:public Cbase
{
public:
Dbase()
{cout<<"Dbase"<<endl; }
~Dbase()
{cout<<"~Dbase"<<endl; }
};
class Dbase:public Cbase
{
public:
Dbase()
{
cout<<"Dbase"<<endl;
}
~Dbase()
{
cout<<"~Dbase"<<endl;
}
};
class Zbase:virtual public CCbase
{
public:
Zbase()
{cout<<"Zbase"<<endl;}
~Zbase()
{cout<<"~Zbase"<<endl;}
};
class MyA:public Dbase,public Bbase,virtual public Abase,virtual Zbase
{
public:
MyA()
{cout<<"MyA"<<endl;}
~MyA()
{cout<<"~MyA"<<endl;}
};
输出:(析构输出省略,和构造相反)
CCbase
Abase
Zbase
Cbase
Dbase
Bbase
MyA
- Cbase 的虚基类是CCbase;
- Zbase的虚基类是CCbase
- Dbase的基类是Cbase;
- MyA 的继承顺序是Dbase,Bbase,Abase,Zbase;其中Abase,Zbase是虚基类。
解析:(正常构造的顺序是按继承的顺序)因为Dbase中存在间接的虚基类CCbase,所以先执行虚基类CCbase的构造;然后后面还存在虚基类Abase,所有再执行Abase的构造;然后执行Zbase(第二条 不再执行它们的基类的构造),然后执行D的基类Cbase,然后是Dbase,Bbase…..