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

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

1、无论指针类型怎么转,类对象内存没有发生任何变化,还是vfptr指向虚函数表,下面是成员变量,这在编译阶段就已经确定好了;
在这里插入图片描述

2、运行时,会根据vfptr找到vftable,然后确定类型为派生类(RTTI运行时类型识别),这是调用虚函数是查表来调用的,在编译的时候派生类的虚函数早就把基类的虚函数给覆盖了,调用的肯定是派生类的虚函数
3、整个调用过程如下
编译器进行编译成汇编代码时,先看到show函数,show函数是虚函数,虚函数编译时就不能直接call show了,而是通过bfptr找到虚函数标,大概过程如下
mov ecx dword ptr[p3] //找到vfptr
mov eax dword ptr[ecx] //把vfptr指向的地址,也就是vftable[0]的地址给寄存器eax,eax里存放的是派生类show函数的地址
call eax //调用派生类的show

以上三句汇编才是虚函数产生多态的核心

在这里插入图片描述

#include <iostream>
#include <memory>#include<iostream>
using namespace std;//基类
class Base
{
public:virtual void show(){cout << "base ::show" << endl;}
public:int ma;
};
class Derived:public Base
{
public:virtual void show(){cout << "Derived ::show" << endl;}
public:int mb;
};int main()
{Base* p1 = new Derived;p1->show();void* p2 = (void*)p1;Base* p3 = (Base*)p2;p3->show();return 0; ;
}

在这里插入图片描述

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

相关文章:

  • 操作系统(Linux实战)-进程创建、同步与锁、通信、调度算法-学习笔记
  • react的setState中为什么不能用++?
  • 2.2算法的时间复杂度与空间复杂度——经典OJ
  • 【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网
  • Linux 操作系统 --- 信号
  • 黑马前端——days09_css
  • 【Python爬虫】技术深度探索与实践
  • 智启万象|挖掘广告变现潜力,保障支付安全便捷
  • 函数递归,匿名、内置行数,模块和包,开发规范
  • Springboot3 整合swagger
  • 查看同一网段内所有设备的ip
  • Spark MLlib 特征工程(上)
  • 《SPSS零基础入门教程》学习笔记——03.变量的统计描述
  • 2024年杭州市网络与信息安全管理员(网络安全管理员)职业技能竞赛的通知
  • SpringBoot参数校验详解
  • 安全基础学习-SHA-1(Secure Hash Algorithm 1)算法
  • leetcode350. 两个数组的交集 II,哈希表
  • 基于YOLOv8的缺陷检测任务模型训练
  • 【upload]-ini-[SUCTF 2019]CheckIn-笔记
  • uniapp条件编译使用教学(#ifdef、#ifndef)
  • NXP i.MX8系列平台开发讲解 - 4.1.2 GNSS 篇(二) - 卫星导航定位原理
  • 怎样在 SQL 中对一个包含销售数据的表按照销售额进行降序排序?
  • DIAdem 与 LabVIEW
  • UE虚幻引擎可以云渲染吗?应用趋势与挑战了解
  • 实战分享:DefenderUI在企业环境中的部署与应用
  • 中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)
  • Android 开发中常用的布局类型及其选择指南
  • 短视频SDK解决方案,降低行业开发门槛
  • 【C++】String常见函数用法
  • LeetCode49.字母异位词分组