下面我来分析几段继承的类跟大家总结一下前面所说的一些理论知识,这里解释了前面 提供默认构造函数的第二点哦,仔细看





仔细观察地址401090,这里先调用了子类的构造函数,但是原来子类里面并没有构造函数,这就是编译器给出的默认构造函数,需要通过这个构造函数,像一个踏板一样,跳到父类的构造函数去,这里就是前面所讲过的 提供默认构造函数的第二点知识。(情况是:父类有构造函数,但是子类没有)

(这里我一直在想,不是得先调用父类的构造函数吗,为什么这里先子类呢?因为你要发现是否有父类,你得先进入子类构造函数去看,先进子类构造函数去看,如果有,则跳到父类构造函数,没有则向下执行,因为这里是提供的默认构造函数,即空函数,所以的话,只有进门操作,执行操作的话直接没了,所以直接返回)

总结:
当CDervie类没有构造函数时,为了能够在CDervie类对象 产生时调用 成员对象 的构造函数,编译器同样会提供默认构造函数,以实现成员构造函数的调用。

但是,如果子类含有构造函数,而父类不存在构造函数,则编译器不会为父类提供默认的构造函数。在构造子类时,由于父类中没有虚表指针,也不存在构造祖先类的问题,因此添加默认构造函数没有任何意义

汇编角度来看待构造顺序



根据上面汇编代码分析:
构造的顺序为:先构造父类(地址4010D5处),然后按声明的顺序构造成员对象(地址4010E7处)和初始化列表中的指定的成员(地址4010EF处),最后才是构造函数(地址4010F6处)。


有了这样的内存结构,不但可以使用指向子类对象的子类指针间接寻址到父类定义的成员,而且可以使用指向子类对象的父类指针间接寻址到父类定义的成员中。

在使用父类成员函数中,传递的this指针也可以是子类对象的首地址,因此,在父类中,可以根据以上内存结构将子类对象的首地址视为父类对象的首地址来进行数据操作,而且还不会出错。

由于父类对象的长度不超过子类对象,而子类对象只要派生新的数据,其长度即可超过父类,因此子类指针的寻址范围不小于父类指针,在使用子类指针访问父类时,如果访问的成员数据是父类对象所定义的,那么不会出错,如果访问的是子类派生的成员数据,则会造成访问越界。



父类中成员函数SetNumber 在子类中并没有被定义,但根据派生关系,子类中可以使用父类的共有函数。编译器是如何实现正确匹配呢?
如使用对象或对象的指针调用成员函数,编译器可根据对象所属作用域来使用“名称粉碎法”,以实现正确匹配。在成员函数中调用其他成员函数时,可匹配当前作用域。

父类数据成员被排列在最前端的目的是为了在添加派生类后方便子类使用父类中的成员类型,并且可以将子类指针当父类指针来使用。

这样一来,不管是操作子类对象还是父类对象,只要确认了对象的首地址,对父类成员数据的偏移量而言都是一样的。对子类的对象而言,使用父类指针或者子类指针都可以正确访问其父类数据。反之,如果使用一个子类对象的指针去访问父类对象,则存在越界访问的危险。

子类对象的指针访问父类对象存在的危险:

定义派生类和继承类(从汇编分析)相关推荐

  1. python类的继承--------类的基础(四)

    2019独角兽企业重金招聘Python工程师标准>>> class schoolmember(object): def __init__(self,name,age): self.n ...

  2. 10. python入门速通教程之类、继承类、类中的特殊方法

    python 学习过程中,对新手来说,最难的就是面向对象部分了,但又不得不把它掌握. 在 python 中所有的内容都是对象 python 中的类 学习面向对象,第一个知识点就是类,它可以看成是对象的 ...

  3. php 继承内核中的基类,php – 从基类调用继承类的父方法

    以下示例不起作用,因为在类A中调用parent时,php会查找类A的父类,但它不存在.我宁愿这一行在B类中调用Test(). 这可能吗? (我知道这似乎是一个愚蠢的例子,但它有一个实际应用) abst ...

  4. 用classwizard生成某个基类的继承类

    1. 打开classwizard 2. 点击Add Class,选择基类

  5. 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 -- 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类. 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接 ...

  6. 任务三 类的继承与派生

    文章目录 第1关:公有继承 -- 学生信息类 相关知识 继承 继承方式 公有继承 编程要求 公有继承 -- 学生信息类 第2关:保护继承 -- 学生信息类 相关知识 保护继承 编程要求 保护继承 -- ...

  7. 【C++】继承和派生、虚继承和虚基类、虚基类表和虚基类指针

    继承和派生.虚继承和虚基类.虚基类表和虚基类指针 继承和派生 继承概述 继承基本概念 派生类中的成员 继承的内容 派生类定义 派生类访问控制 对象构造和析构 对象构造和析构的调用顺序 继承中的构造和析 ...

  8. C++:随笔5---this指针和类的继承

    this指针:(通过一个典型的例子来认识他) class Human {char fishc;Human(char fishc);//构造函数}; Human::Human(char fishc)// ...

  9. python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?

    在这篇文章之中我们来了解一下python类的继承,对于刚刚接触到python这一编程语言的朋友来说,对于python类的继承的了解应该比较少,不过没关系,在接下来的文章之中我们就来了解一下python ...

最新文章

  1. linux平台下防火墙iptables原理(转)
  2. C++ 中的卷积神经网络 (CNN)
  3. 编程语言python培训-0基础转行IT,编程语言应该学习Java还是Python呢?
  4. 32位mysql安装包_《MySQL 入门教程》第 02 篇 MySQL 安装
  5. 【Python】青少年蓝桥杯_每日一题_3.19_约分
  6. nodejs ajax进度条,Ajax异步文件上传与NodeJS express服务端处理的示例分析
  7. Nobody can go back and start a new beginning, but anyone can start now and make a new ending.
  8. Jzoj3898 树的连通性
  9. 【github系列】github上传空目录
  10. 002 Ajax中传输格式为HTML
  11. C++ int string 转换
  12. 解决C#中ListView闪烁的办法
  13. Zend Studio主题的设置
  14. html可视化布局系统源码,一个开源可视化布局项目,在线生成纯css布局,可阅读的代码。...
  15. ISA防火墙策略配置
  16. 流媒体视频网络 Tout 获 2600 万美元 C 轮融资
  17. mysql 复合索引 悲观锁_对MySQL索引、锁及事务的简单分析
  18. 中文电子图书数字图书馆建设解决方案
  19. 双向链表 建立和插入
  20. C++ 背包问题——多重背包

热门文章

  1. 成功解决ValueError: Unable to add relationship because child variable ‘ID‘ in ‘cats_df‘ is also its inde
  2. 成功解决AttributeError: module 'tensorflow.python.ops.nn' has no attribute '_seq2seq'
  3. BC之链式块状结构:区块链之链式块状结构——链式块状结构、内容相关配图
  4. TF之LiR:基于tensorflow实现手写数字图片识别准确率
  5. L1,L2正则化分析
  6. customize shell prompt
  7. BZOJ3569: DZY Loves Chinese II(线性基构造)
  8. Appium录制脚本520-2
  9. 三、python沉淀之路--列表(list)
  10. seaJS简介和完整实例