
- 在派⽣类构造函数中,所有的虚基类及上⼀层基类的构造函数调⽤;
- 对象的 vptr 被初始化;
- 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做;
- 执⾏程序员所提供的代码;
- 记录在成员初始化列表中的数据成员初始化 *** 作会被放在构造函数的函数体内,并与成员的声明顺序为顺序;
- 如果⼀个成员并没有出现在成员初始化列表中,但它有⼀个默认构造函数,那么默认构造函数必须被调⽤;
- 如果 class 有虚表,那么它必须被设定初值;
- 所有上⼀层的基类构造函数必须被调⽤;
- 所有虚基类的构造函数必须被调⽤
- 析构函数函数体被执⾏;
- 如果 class 拥有成员类对象,⽽后者拥有析构函数,那么它们会以其声明顺序的相反顺序被调⽤;
- 如果对象有⼀个 vptr,现在被重新定义
- 如果有任何直接的上⼀层⾮虚基类拥有析构函数,则它们会以声明顺序被调⽤;
- 如果任何虚基类拥有析构函数
例子:
#include
using namespace std;
class OBJ1
{
public:
OBJ1(){ cout <<"OBJ1\n"; }
};
class OBJ2
{
public:
OBJ2(){ cout <<"OBJ2\n"; }
};
class Base1
{
public:
Base1(){ cout <<"Base1\n"; }
};
class Base2
{
public:
Base2(){ cout <<"Base2\n"; }
};
class Base3
{
public:
Base3(){ cout <<"Base3\n"; }
};
class Base4
{
public:
Base4(){ cout <<"Base4\n"; }
};
class Derived :public Base1, virtual public Base2,
public Base3, virtual public Base4
{
public:
Derived() :Base4(), Base3(), Base2(),
Base1(), obj2(), obj1()
{
cout <<"Derived ok.\n";
}
protected:
OBJ1 obj1;
OBJ2 obj2;
};
int main()
{
Derived aa;
cout <<"This is ok.\n";
int i;
cin >> i;
return 0;
}
结果:
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok.
This is ok.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)