Win32汇编:仿写多态与虚函数
多态性是面向对象的重要组成部分,利用多态可以设计和实现易于扩展的程序,所谓多态就是一个类函数有多重形态,具有不同功能的函数可以用同一个函数名,实现使用一个函数名调用不同内容的函数,从而返回不同的结果,这就是多态性,多态离不开虚函数的支撑,以下案例本人将深度分析虚函数实现机制,并通过汇编实现虚函数机制。
- 从系统实现的角度来分析,多态性可分为两类,静态多态与动态多态:
- 静态多态: 通常是通过函数或运算符的重载实现的,静态多态性又称作编译时的多态性.
- 动态多态: 动态多态性不在编译时确定调用函数的功能,而是通过虚函数实现,它又被叫做运行时的多态性.
由于对象多态性需要通过虚表和虚表指针来完成,虚表指针被定义到对象首地址前4字节处,虚表指针中保存着虚表的首地址,用于记录和查找虚函数,由于虚表指针的初始化依赖于构造函数,如果用户没有提供默认构造函数,那么编译器会自动增加。
在C++中使用关键字virtual声明函数为虚函数,我们首先编写一段C++代码,请自行反汇编观察虚函数的特性
#include <iostream>
using namespace std;
class CVirtual
{
private:
int m_Number;
public:
virtual int GetNumber()
{
return m_Number;
}
virtual void SetNumber(int num)
{
m_Number = num;
}
};
int main(int argc, char* argv[])
{
CVirtual cv;
cv.SetNumber(5);
printf("virtual = > %d \n", cv.GetNumber());
return 0;
}
仿写汇编代码。
.386p
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
; 虚表占据类前4字节
Student struct
virtualBase DWORD 0
x DWORD 0
Student ends
.data
stu Student <>
virtual_table DWORD 0,0,0,0,0,0,0dh
.code
SetNumber PROC
SetNumber ENDP
GetNumber PROC
ret
GetNumber ENDP
; 模拟构造函数,初始化虚表指针
Init PROC
; 将虚表指针首地址放入到类的开头位置
mov dword ptr [stu],ecx
; 构建函数表
mov dword ptr [virtual_table],offset GetNumber
mov dword ptr [virtual_table+4h],offset SetNumber
ret
Init ENDP
main PROC
push ebp
mov ebp,esp
sub esp,0f4h
push ebx
push esi
push edi
lea edi,dword ptr [ ebp - 0f4h ]
mov ecx,03dh
mov eax,0CCCCCCCCh
rep stosd
lea ecx,stu ; 获取类的首地址
call Init ; 调用构造函数
pop edi
pop esi
pop ebx
add esp,0f4h
mov esp,ebp
pop ebp
ret
main ENDP
END main
Win32汇编:仿写多态与虚函数的更多相关文章
- C++中的多态与虚函数的内部实现
1.什么是多态 多态性可以简单概括为“一个接口,多种行为”. 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可 ...
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- C++多态、虚函数、纯虚函数、抽象类
多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...
- 《挑战30天C++入门极限》C++中类的多态与虚函数的使用
C++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...
- [c++] C++多态(虚函数和虚继承)
转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C+ ...
- 从汇编层面深度剖析C++虚函数
文章出处:http://blog.csdn.net/linyt/article/details/6336762 虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合 ...
- C++中类的多态与虚函数的使用
C++的三大特性:封装.继承.多态.以前学的时候自己没去总结,记得在一本c++入门的书讲得还是比较清楚.今天上网找了一下多态,找到下面这篇文章写得比较清晰. http://pcedu.pconline ...
- C++多态,虚函数,虚函数表,纯虚函数
1.多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作. C++支持两种多态性:编译时多态性,运行时多态性. a.编译时多态性:通过重载函数实现 ,模板(2次编译) ...
- c++ 多态,虚函数、重载函数、模版函数
c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...
- C++多态之虚函数
多态:不同对象收到相同消息时,产生不同的动作.(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作). 在c++中实现多态,我 ...
随机推荐
- TCP 拥塞控制对数据延迟的影响
哈喽大家好,我是咸鱼 今天分享一篇文章,是关于 TCP 拥塞控制对数据延迟产生的影响的.作者在服务延迟变高之后进行抓包分析,结果发现时间花在了 TCP 本身的机制上面:客户端并不是将请求一股脑发送给服 ...
- 【MFC】CListCtrl 如何设置单元格颜色?
CListCtrl默认可设置的内容很少,如单元格颜色默认无法设置.若想设置单元格颜色,需要对CListCtrl进行拓展,已有老外为我们写好demo,这里对其中原理.设置方法进行一个解析. 其原理是:设 ...
- Java 内存管理最佳实践
本文翻译自国外论坛 medium,原文地址:https://medium.com/@fullstacktips/best-practices-for-memory-management-in-java ...
- Java 子父类型集合之间的转换
假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办? class Animal { } class Dog extends Animal { ...
- Linux系统下安装JDK8和Maven3.8.5
一.下载JDK8Linux版本 官网下载太慢了,小编这里为大家下载好了: 链接:百度网盘地址 提取码:ov24 二.下载Maven maven3.8.5下载链接 三.使用xftp上传到linux上 四 ...
- SpringBoot开启动态定时任务并手动、自动关闭
场景需求:在执行某个方法的两小时之后进行某个操作 涉及:定时任务.哈希表 需要注意:业务逻辑层是单一实例的,所以在定时任务类内操作业务逻辑层的某个属性和在业务逻辑层内操作的都是同一个. 疑问:Thre ...
- [转帖]nginx 日志打印响应时间 request_time 和 upstream_response_time
https://www.cnblogs.com/chooperman/p/14722450.html 设置log_format,添加request_time,$upstream_response_ti ...
- [转帖]tcplife的使用
https://www.rutron.net/posts/2203/bcc-tcplife-usage/ 这篇文档主要演示了 tcplife(Linux eBPF/bcc) 工具的使用. 示例 tcp ...
- [转帖]clickhouse 超底层原理& 高可用集群 实操(史上最全)
https://www.cnblogs.com/crazymakercircle/p/16718469.html 文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵 ...
- [转帖]Nacos使用2.0.1版本启动出现9848端口错误的解决方式(亲测有效)
目录 一.背景 二.报错如下 三.报错原因 四.解决方式 一.背景 nacos服务端和客户端都是 2.x版本. centos7使用原始安装nacos单机版,没有使用docker安装naocs集群. 二 ...