2018-03-19  创建人:Ruo_Xiao
邮箱:xclsoftware@163.com

一、建立对象过程

father → son

栗子:

class Parent
{public:Parent() { i_parent_ = 0; }~Parent(){i_parent_ = 0;}
public:int i_parent_;
};class Son : public Parent
{public:Son(){ i_son_ = 0; }~Son(){i_son_ = 0;}
public:int i_son_;
};int main()
{Son sn;return 0;
}

转入汇编代码,如下:

      通过代码可以知道,首先调用的是 Son 类构造函数。进入,如下图所示:

      通过代码可以知道,编译器在 Son 类的构造函数开头插入了 Parent 类的构造函数,从而完成对 Parent 类构造函数的调用。
      再进入代码,如下图所示:

      经过上述过程之后,从而完成子类构造函数调用父类构造函数。

二、销毁对象过程

子类 → 父类

转入汇编代码,如下:

      由上图可知,直接调用了 Son 类的析构函数。
进入,汇编代码如下:

      由上图可知,是先调用子类的析构函数之后再调用父类的析构函数。

(SAW:Game Over!)

Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序相关推荐

  1. Cpp 对象模型探索 / new 运算符内部调用过程分析

    一.new 调用过程 1.测试代码 class CTest { public:CTest(){} };int main() {CTest *pt1 = new CTest();delete pt1;r ...

  2. Cpp 对象模型探索 / 虚函数的调用方式

    虚函数有两种调用方式: 方案1,直接使用函数地址调用. 方案2,通过对象的虚函数表指针找到虚函数表,从而得到函数地址,完成调用. 应用场景主要有如下三种情况: 当对象直接调用时,采用方案 1 调用虚函 ...

  3. Cpp 对象模型探索 / delete 运算符内部调用过程分析

    一.delete 调用过程 1.测试代码,在 delete 处打下断点. class CTest { public:CTest() {}~CTest() {} };int main() {CTest* ...

  4. Cpp 对象模型探索 / 编译器为对象创建缺省析构函数的条件

    1.基类中含有析构函数的子类,编译器为子类创建析构函数. 2.类成员变量是类对象,该类对象含有析构函数,则编译器为子类创建析构函数. 代码 class Parent { public:~Parent( ...

  5. 何时调用构造函数和析构函数

    何时调用构造函数和析构函数 构造函数的作用是保证每个对象的数据成员都有何时的初始值. 析构函数的作用是回收内存和资源,通常用于释放在构造函数或对象生命期内获取的资源. 一般我们都知道构造和析构的次序: ...

  6. Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机

    class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...

  7. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  8. Cpp 对象模型探索 / 单一继承的类的内存布局

    目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...

  9. Cpp 对象模型探索 / 对象访问成员变量的原理

    一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...

最新文章

  1. 2021年逆天Java调优方案出来了!直接省掉一半成本,吹爆!!!
  2. 工程师忽略的隐形成本
  3. 你觉得什么才是 Java 的基础知识?
  4. Mysql : InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!
  5. 在Linux命令行发送电子邮件附件的两种方法
  6. 【C++入门】C++类和对象
  7. Template Method模板方法
  8. 【Python】实例3:天天向上的力量与微实例:星期转换、恺撒密码
  9. Node包管理使用全教程
  10. Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术
  11. 近几年网络营销成功案例精选
  12. bzoj 1864 三色二叉树
  13. 经典排序算法之:堆排序
  14. 如何下载最新电影高清资源?
  15. 如何将ppt演示文稿上传到微信公众号?
  16. 解决:el-input添加clearable属性后出现2个×清除图标
  17. win10桌面版outlook邮箱配置流程
  18. iCollections for Mac(桌面文件整理软件)
  19. 手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 #
  20. 手机游戏运行时分析工具

热门文章

  1. Eclipse无法连接真机 并非ADB被占用 原因 很2 已解决 记录之
  2. 话里话外:实现信息化综合集成需要经历的五个阶段
  3. 网站不能访问的解决思路
  4. 创作共用协议创始人-Lawrence Lessig(2)
  5. 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法
  6. Spark配置属性整理(非常全面)
  7. Spark常规性能调优三:并行度调节
  8. deepin linux深度ISO镜像下载地址
  9. Linux /usr/bin与/usr/local/bin区别
  10. linux useradd命令使用示例