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

C++逆向分析--继承的本质

 一.一些思考

继承是面向对象的三个特性之一。这篇文章我们从底层的角度去理解什么是继承。他的作用是什么。首先继承的出现是更好的避免代码的重复冗余。要理解一件事很重要,C++其实是C的延申。那么C++的出现是为了解决C语言上C++祖师爷认为不友好的事情,也为了简化代码的复杂度,将更多的事情交给编译器去做,而不是程序员自己本身。举个例子,C++在类的创建和释放的过程中,会自动调用构造函数和析构函数,这是上一篇文章提到的C语言没有这个功能。那么C语言难道就做不到了吗,其实不然,C语言可以自己显示的调用函数,来模拟完成构造函数和析构函数。所以说面向对象是一种编程思想,而不是代码本身的特性。关于这一点的理解是我研究C程序中glibc对程序的初始化和程序的退出时的函数调用链思考而得。本质上其实就是在做构造函数和析构函数的工作。有了这个思考,那么继承的出现我们也能去思考。

二.继承是什么

C++在定义一些类的时候,我们很可能会发现有些共同的特性,也就是相当的数据字段。比如说:

创建一个学生类:

class Student{public:sting name;int age;float height;int class_num;
};

比如我创建一个学生类,有姓名年龄身高班级。

创建一个老师类:

class Teacher{public:string name;int age;float height;float wages;};

现在我们又创建一个老师类,依然是有四个成员属性。但是我们发现,有三个属性是相同的,如果写两份会显得很臃肿,于是继承就出现了。我们写一个大家公有的类,那么需要的时候直接继承就会显的很高逼格:

class Person {
public:string name;int age;int height;};class Student :public Person {
public:int class_num;
};class Teacher :public Person {
public:int wages;
};

我们看到将公有的属性提取出来,并且自身独有的依然在自己的类中。现在我们分别创建一个学生对象和老师对象,看看能不能访问公有的成员:


我们看到是没有问题的。下面我们看看汇编是如何执行的:


由于字符串还需要做些特殊处理,我们只看数字赋值,我们发现在创建的类中,确实有Person字段的赋值,因为rbp-0x80的位置就是s1对象的起始位置。也就是this指针。布局相当于这样:


相应的老师对象的创建赋值也是一样的过程


因此我们知道了父类也就是基类,在继承的时候布局是这样的:


因此我们可以明白,在继承的时候,父类和子类独有的属性将组合成一个新的类,新的对象的首地址其实是指向父类的。因此就引出了一个新的概念:既然如此我如果用父类对象的指针指向一个子类对象,和一个子类对象指针指向子类岂不是一样的吗,确实如此。我们写一个demo测试下:


经过我们的测试发现确实是这么回事。那么他们有什么区别呢?很显然是访问成员的限制,用父类创建的指针只能访问父类的成员,用子类创建的指针能够访问全部成员。也可以这么理解把,父亲会的儿子也会,父亲不会的儿子也会。可能这就是青出于蓝胜于蓝的代码体现吧。实验下是否是这样:(这里我用linux测试的,其实是一样的)

    Student s1;s1.name = "Chenweixin";s1.age = 1;s1.height= 2;s1.class_num = 2;Teacher t1;t1.name = "Guozhiwei";t1.age = 1;t1.height = 1;t1.wages = -250;Student* p1 = &s1;Person* p2 = &s1;cout <<"Person->name="<<p2->name<<"Person->age="<<p2->age<<"Person->height=" <<p2->height<< endl;cout <<"Student->name="<<p1->name<<"Student->age="<<p1->age<<"Student->height=" <<p1->height<< endl;

此时我们通过指针去访问父类成员看看是不是一样的:


我们看到没有任何问题,那接着父类能访问子类的成员吗,答案是否定的,父类都没有子类的成员如何去访问:此时我加了一句p2->class_num看看能不能通过父类指针找到子类成员:


我们发现报错了。告诉我们没有成员叫class_num。但是其实这是编译器做的限制,我们很清楚其实在height成员下面就是class_num成员,只不过父类指针是没有权限去访问的。子类对象指针就不会出现这种问题:


因此我们可以总结如下:

                继承的本质就是数据的复制, 当发生继承的时候,将父类的模板和子类独有的模板合二为一,这个过程是编译器做的。那么对象创建成功后,就会有这么模板的完全体。this指针指向的其实是父类的对象,不管用父类指针访问还是子类指针访问都是一样的。只不过父类指针只能访问父类中的成员,子类能够访问全部成员。多重继承的效果也是一样的。用个现代化术语来说谁是老祖宗谁排在前面。因此发生多重继承的时候,最开始的地方是第一个父类,以此类推,完全体是依然是子类。

希望通过这篇博客能加深自己对继承的理解。

相关文章:

C++逆向分析--继承的本质

一.一些思考 继承是面向对象的三个特性之一。这篇文章我们从底层的角度去理解什么是继承。他的作用是什么。首先继承的出现是更好的避免代码的重复冗余。要理解一件事很重要&#xff0c;C其实是C的延申。那么C的出现是为了解决C语言上C祖师爷认为不友好的事情&#xff0c;也为…...

​LeetCode解法汇总2865. 美丽塔 I

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个长…...

pinia 的使用方法

使用方式&#xff08;选项式&#xff09; 1、在 mian.js 导入 pinia 里的 createPinia 函数。 2、app.use 这个 createPinia 函数的返回值。 // main.jsimport { createPinia } from pinia;app.use(createPinia()); 3、创建一个 js 文件&#xff08;该文件保存着共享的数据&…...

sky_take_out

day01&#xff1a; 前端网址通过nginx访问后端网址&#xff08;前后网址不一致&#xff09;&#xff0c;有三个好处&#xff1a; 一是提高访问速度&#xff0c;二是进行负载均衡&#xff0c;三是保障后端安全性 用md5加密了密码 后端使用knife4j调试,用Swagger生成接口文档&am…...

LC 2865. 美丽塔 I

2865. 美丽塔 I 难度 : 中等 题目大意 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < heights…...

代理设计模式JDK动态代理CGLIB动态代理原理

代理设计模式 代理模式&#xff08;Proxy&#xff09;&#xff0c;为其它对象提供一种代理以控制对这个对象的访问。如下图 从上面的类图可以看出&#xff0c;通过代理模式&#xff0c;客户端访问接口时的实例实际上是Proxy对象&#xff0c;Proxy对象持有RealSubject的引用&am…...

[陇剑杯 2021]webshell

[陇剑杯 2021]webshell 题目做法及思路解析&#xff08;个人分享&#xff09; 问一&#xff1a;单位网站被黑客挂马&#xff0c;请您从流量中分析出webshell&#xff0c;进行回答&#xff1a; 黑客登录系统使用的密码是_____________。 题目思路&#xff1a; 分析题目&…...

美易官方:小米汽车交付时间传闻被官方辟谣

在科技与互联网的快速发展浪潮中&#xff0c;各类信息传播速度之快令人咋舌。然而&#xff0c;信息的真实性却时常成为公众关注的焦点。近日&#xff0c;关于小米汽车交付时间的谣言再次引起市场的广泛关注。小米公司发言人迅速作出回应&#xff0c;明确指出这些关于小米汽车交…...

MySQL 简介

什么是MySQL&#xff1f;&#xff08;熟悉&#xff09; MySQL是一个开源的、使用标准SQL语言的、可运行于多个系统的、支持多语言的、支持大型数据库的关系型数据库管理系统。由瑞典 MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。我们通常使用关系型数据库管理系统…...

动态规划最后一天(回文串)

目录 647. 回文子串 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难(看代码) 516.最长回文子序列 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难(看代码) 647. 回文子串 力扣题目链接…...

c语言之scanf函数

scanf函数语法格式与printf函数很相似&#xff0c;语法是scanf(格式控制,地址列表)组成 其中格式控制分为两部分&#xff0c;一部分由双引号括起来的&#xff0c;%和格式字符组成的格式字符串 普通字符串则是原样输出 地址列表是若干地址组成的表列&#xff0c;可以是变量的…...

ORM-02-JPA Java Persistence API 注解入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; JPA JPA是Java Persistence API的简称&#xff0c;中文名Java持久层API&#xff0c;是JDK 5.0注解或XML描述对象&#xff0d;关系表的映射…...

【MQ01】什么是消息队列?用哪个消息队列?

什么是消息队列&#xff1f;用哪个消息队列&#xff1f; 来了来了&#xff0c;消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀&#xff1f;其实对于搜索引擎来说&#xff0c;我们学习的内容还是挺全面的&#xff0c;也算是比较深入了。而对于消息队列来说&am…...

2023年度AI盘点 AIGC|AGI|ChatGPT|人工智能大模型

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一年里集中出现&#xff0c;很容易混淆&#xff0c;甚至把人搞懵。 文章目录 前言01 《ChatGPT 驱动软件开…...

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…...

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中&#xff0c;中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位&#xff0c;所在部门为长城新盛信托有限责任公司。目前完成了一面&#xff0c;在这里记录一下一面经…...

【计算机网络】TCP握手与挥手:三步奏和四步曲

这里写目录标题 前言三次握手四次挥手三次握手和四次挥手的作用TCP三次握手的作用建立连接防止已失效的连接请求建立连接防止重复连接 TCP四次挥手的作用&#xff1a;安全关闭连接避免数据丢失避免半开连接 总结&#xff1a; 总结 前言 TCP&#xff08;传输控制协议&#xff09…...

设计模式学习总结

责任链模式 使用方法&#xff1a; 1.创建接口 2.定义实现类&#xff0c;每个实现类实现接口&#xff0c;并拥有一个ArchiveHandle的成员&#xff0c;用作责任链的链接 public interface ArchiveHandle {void handle(ArchiveVO archiveVO); } public class ArchivePreHandle i…...

「HDLBits题解」Cellular automata

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Rule90 - HDLBits module top_module(input clk,input load,input [511:0] data,output [511:0] q );always (posedge clk) begin…...

什么是API ?

API&#xff08;应用程序编程接口&#xff09; 就像现成的家具套件相对于家居建设&#xff0c;用一些已经切好的木板组装一个书柜&#xff0c;显然比自己设计&#xff0c;寻找合适的木材&#xff0c;裁切至合适的尺寸和形状&#xff0c;找到正确尺寸的螺钉&#xff0c;然后再组…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...