继承体系中 destructor 的执行次序
来源:互联网 发布:模特兼职知乎 编辑:程序博客网 时间:2024/05/01 00:46
《深度探索C++对象模型》P.233 L.-2:
一个由程序员定义的 destructor 被扩展的方式类似 constructor 被扩展的方式,但顺序相反:
1. 如果 object 内带一个 vptr,那么首先重设 (reset) 相关的 virtual table;
If the object contains a vptr, it is reset to the virtual table associated with the class.
2. destructor 的函数本身现在被执行,也就是说 vptr 会在程序员的码执行前被重设 (reset);
The body of the destructor is then executed; that is, the vptr is reset prior to evaluating the user-supplied code.
3. 如果 class 拥有 member class objects,而后者拥有 destructors,那么它们会以其声明顺序的相反顺序被调用;
If the class has member class objects with destructors, these are invoked in the reverse order of their declaration.
4. 如果有任何直接的(上一层)nonvirtual base classes 拥有 destructors,它们会以其声明顺序的相反顺序被调用;
If there are any immediate nonvirtual base classes with destructors, these are invoked in the reverse order of their declaration.
5. 如果有任何 virtual base classes 拥有 destructor,而当前讨论的这个 class 是最尾端 (most-derived) 的 class,那么它们会以其原来的构造顺序的相反顺序被调用。
If there are any virtual base classes with destructors and this class represents the most-derived class, these are invoked in the reverse order of their original construction.
侯捷认为正确的顺序应该是 2、3、1、4、5。即:
1. destructor 的函数本身首先被执行;
2. 如果 class 拥有 member class objects,而后者拥有 destructors,那么它们会以其声明顺序的相反顺序被调用;
3. 如果 object 内带一个 vptr,则现在被重新设定,指向适当之 base class 的 virtual table;
4. 如果有任何直接的(上一层)nonvirtual base classes 拥有 destructors,它们会以其声明顺序的相反顺序被调用;
5. 如果有任何 virtual base classes 拥有 destructor,而当前讨论的这个 class 是最尾端 (most-derived) 的 class,那么它们会以其原来的构造顺序的相反顺序被调用。
从下面测试代码的输出,可以看出,在 VC++ 2005 编译器中,侯捷的说法是正确的。
测试代码:
程序输出:
- 继承体系中 destructor 的执行次序
- JS中函数运行的执行次序
- C#中WinForm窗体事件的执行次序
- C#中WinForm窗体事件的执行次序如下:
- java中“或”(||)条件的执行次序
- SQL Server Select中函数执行的次序
- 虚基类的执行次序分析
- 有继承关系的构造函数和析构函数的执行次序
- C++继承体系下构造的执行顺序
- 一个WEB页面中代码执行次序
- WEB页面中代码执行次序
- 单继承,构造函数的调用次序
- Page里的事件 执行的次序
- C# 的继承体系
- 集合的继承体系
- 继承中构造函数和析构函数的调用次序
- Java构造函数的执行次序
- Robocode的线程与执行次序
- POJ1061 青蛙的约会 推广的欧几里得算法
- 孙鑫VC学习(第16课:线程同步与异步套接字编程)
- 第一篇博文
- 水果皮的妙用
- 跟我一起学MiniOA:第一章 1.3 JSF标签参考(连载)
- 继承体系中 destructor 的执行次序
- Modules, User Space and Kernel Space
- Android audio codec power consumption
- 在qtopia中添加应用_arm-qtopia(基于mini2440-Friendly)
- 跟我一起学MiniOA:第一章 1.4 Richfaces控件(连载)
- 孙鑫VC学习(第13课--文档与串行化)
- Excel列名与数字的相互转换
- UIImage应用与内存管理
- 银行业务调度系统