当前位置: 首页 > news >正文

《C++代码分析》第三回:类成员函数覆盖父类函数的调用(分析this指针的变化)

一、前言

在C++的学习中我们知道,子类是可以覆盖父类的方法,这里我们探讨一下子类方法调用父类方法时this指针时如何变化的。

二、示例代码

#include "windows.h"
#include "windef.h"
#include <iostream>
#include <tchar.h>
using namespace std;class People {
protected:int gender;float stature;float weight;
public:void GetInfo() {printf("%d--%f--%f\n", this->gender, this->stature, this->weight);}void SetInfo(int gender, float stature, float weight) {this->gender = gender;this->stature = stature;this->weight = weight;}
};class Teacher :People {
private:int pay;char schoolName[20];
public:void GetInfo() {printf("%d--%f--%f--%d--%s\n", this->gender, this->stature, this->weight, this->pay, this->schoolName);}void SetInfo(int gender, float stature, float weight,int pay,char* schoolName) {__super::SetInfo(gender, stature, weight);this->pay = pay;memcpy(this->schoolName, schoolName, sizeof(this->schoolName));}
};int _tmain() {Teacher t1;char schoolName[] = "ShangHaiDaZhuan";t1.SetInfo(1, 120, 180, 102402, schoolName);t1.GetInfo();return 0;
}

在这里插入图片描述
显然父类的GetInfo被子类覆盖,这里我们将在后面的汇编中简单的查看。注意我们调用子类的SetInfo中调用了父类的SetInfo,我们看看是如何获取People的this指针的

三、详解

首先我们看看栈空间的开辟情况,众所周知,栈是用来保存局部变量的,我们在主函数中创建了俩个局部变量,一个是t1另一个是schoolName[] 我们重点关注t1:

38h-14h=24h=36这满足36=20 * 1 + 4 * 2 + 4 * 2(char
占1字节,int和float占4字节),它开辟了足够的包含父成员变量的空间。

在这里插入图片描述在这里插入图片描述

PS:movss在俩个xmm指令寄存器之间或者内存位置和xmm寄存器之间复制标量浮点数

在这里插入图片描述
this指针的第一层传递(指向Teacher类的),默认使用ecx进行传递

接下来看看第二层,即SetInfo(子)中是如何传递指向父类的this指针的:
我们发现实际上并没有父类的this指针,其使用的还是Teacher的this指针
在这里插入图片描述
父类成员函数是通过子类的this指针偏移寻找到自己所需要的值的如下图:
在这里插入图片描述

http://www.lryc.cn/news/38409.html

相关文章:

  • Altium designer--软件简介及安装教程(Altium designer16)
  • Windows系统下基于开源软件的多物理场仿真
  • 【STL】list剖析及模拟实现
  • Go打包附件内容到执行文件
  • Spring的配置属性
  • 132.《render-props, Hoc,自定义hooks 详解》
  • 通过Session共享数据验证码进行用户登录
  • C++STL详解(六)——stack和queue
  • javaEE 初阶 — CSS 的 基本语法 与 引入方式
  • QEMU启动ARM32 Linux内核
  • than的用法合集
  • Unet 基于TCGA颅脑肿瘤MRI分割(高阶API分割模型)
  • [NIPS 2017] Improved Training of Wasserstein GANs (WGAN-GP)
  • 力扣-每天的领导和合伙人
  • 考虑分配与合并,用GO实现GCMarkSweep
  • 浙江大学海宁IMBA提面经验分享
  • Mybatis源码分析系列之第四篇:Mybatis中代理设计模型源码详解
  • JDBC的API详解
  • 【深度强化学习】(4) Actor-Critic 模型解析,附Pytorch完整代码
  • SQL注入——文件上传
  • 【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(新的开篇)”】
  • Uipath Excel 自动化系列18-RefreshPivotTable(刷新透视表)
  • 设计模式之不变模式
  • C++11 map
  • docker基本命令 - 数据卷
  • SQL查漏补缺
  • 偏向锁撤销
  • Qt版海康MV多相机的采集显示程序
  • 2023年江苏省职业院校技能大赛中职网络安全赛项试卷-教师组任务书
  • 零基础小白如何自学网络安全成为顶尖黑客?