深剖基类和派生类的虚函数表

2023-05-16

1、当派生类实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数地址不同;

当派生类不实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数的地址相同。

1、派生类重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址 

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. class Base{  
  4.     public:   
  5.     virtual void fun()  
  6.     {  
  7.         cout<<"This is Base Class"<<endl;  
  8.     }  
  9. };  
  10. class Derived:public Base{  
  11.     public:  
  12.     void fun()  
  13.     {  
  14.         cout<<"This is Derived Class"<<endl;  
  15.     }  
  16. };  
  17. int main()  
  18. {  
  19.     Base B;  
  20.     Derived D;   
  21.     int **p=(int**)&B;  
  22.     cout<<"基类的虚函数表地址:"<<p[0]<<endl;  
  23.     cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;  
  24.     p=(int**)&D;  
  25.     cout<<"派生类的虚函数表地址:"<<p[0]<<endl;  
  26.     cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;  
  27.       
  28.     return 0;  
  29. }  

输出结果:
基类的虚函数表地址:0x445060
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445070
派生类的虚函数表中虚函数的地址:0x4153dc
可以看出,基类和派生类的虚函数表不同,虚函数的地址也不同。这个结果符合预期,因为派生类中重新实现了虚函数,基类肯定

有自己的虚函数表,虚函数的地址自然是重新实现的那个。

2、派生类不重新实现虚函数。查看其虚函数表和虚函数表中虚函数的地址 

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. class Base{  
  4.     public:   
  5.     virtual void fun()  
  6.     {  
  7.         cout<<"This is Base Class"<<endl;  
  8.     }  
  9. };  
  10. class Derived:public Base{  
  11.       
  12. };  
  13. int main()  
  14. {  
  15.     Base B;  
  16.     Derived D;   
  17.     int **p=(int**)&B;  
  18.     cout<<"基类的虚函数表地址:"<<p[0]<<endl;  
  19.     cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;  
  20.     p=(int**)&D;  
  21.     cout<<"派生类的虚函数表地址:"<<p[0]<<endl;  
  22.     cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;  
  23.       
  24.     return 0;  
  25. }  
  26. 输出结果: 
基类的虚函数表地址:0x445050
基类的虚函数表中虚函数的地址:0x415390
派生类的虚函数表地址:0x445060
派生类的虚函数表中虚函数的地址:0x415390

派生类虽然重新实现虚函数,但是派生类有自己的虚函数表,但是虚函数表中,虚函数的地址和基类中虚函数的地址一样。 

3、一个类继承多个基类时,有一张虚函数表,多个虚函数指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深剖基类和派生类的虚函数表 的相关文章

  • ROS的一些基础的知识,自用

    零散小知识 先参考这个博客 再参考这个博客总结的知识点 查看当前所以发布的话题名 rostopic list 让ros一直调用回调函数 xff0c ros spin如下的代码无效函数 ros span class token operato
  • TMS320F28377X芯片can通信心得笔记(2)——流程细节

    一 xff0c 前言 补充上一篇文章 TMS320F28377X芯片can通信心得笔记 xff0c 之前一直找不到清晰又压缩的方式把图片缩小 二 xff0c 补充流程如图片和部分代码 带颜色 和带 号部分为中断配置 1 CAN配置部分代码
  • IDEA创建一个servlet项目

    1 File gt project gt java project 选中web application 如果选择java Enterprise可以免去后期导入servlet api jar包和配置Tomcat xff0c 但是需要在proj
  • STM32系列单片机的标准外设库、HAL库和LL库的区别和介绍

    本文转载自CSDN博客 xff1a ZCShouEXP xff0c 点击此处跳转至原博客 STM32 Embedded Software 工作以来一直使用意法半导体 xff08 ST xff09 的STM32系列MCU xff0c ST为开
  • Github的wiki编写

    全球最大的wiki xff0c 应该就是维基百科吧 xff0c 其实百度百科 xff0c csdn写博客等等也是wiki 不久前自己接触了Github wiki的编写 xff0c 因此做个记录吧 模式一般选择Markdown xff0c 因
  • EGOPlanner—Prometheus代码阅读笔记汇总

    Prometheusv2中的EGOSwarm代码阅读笔记 xff0c 个人学习用 目前还有部分代码没看明白 xff0c 欢迎大家交流 xff01 主要参考资料 xff1a Fast Planner 代码解读参考资料整理 EGO Swarm代
  • UAVControl—Prometheus代码阅读笔记【二】——节点实现

    Prometheusv2中的uav control代码阅读笔记 xff0c 个人学习用 内容正在补充中 xff0c 欢迎大家交流 xff01 代码来源 xff1a https github com amov lab Prometheus 二
  • 记录Ubuntu server不能输入中文的全记录--没有解决(最后靠装的桌面版+x11vnc解决)

    1 网上查到的资料都是针对桌面版本的 xff0c 所以先安装了一个vnc桌面 xff0c 至少右击可以看到包含了系统属性 参考链接 xff1a https blog csdn net wayway0554 article details 8
  • int 和 Integer的区别

    int 和 Integer的区别 分析intIntegerint 与 Integer 的区别相同值下的 int 和 Integer 的比较结果 分析 int int 是java的基本数据类型 Integer Integer 继承了Objec
  • C/C++ 使用信号量控制线程运行顺序

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • C++ 问题整理

    说一下C 43 43 和C的区别 设计思想上 xff1a C 43 43 是面向对象的语言 xff0c 而 C 是面向过程的结构化编程语言 C 43 43 具有封装 继承和多态三种特性 C 43 43 支持范式编程 xff0c 比如模板类
  • 职业向导 - 面试题目汇总(嵌入式篇)

    自己踩的坑 存储类操作系统类总线类工具实用类基本电路知识类计算机语言类 存储类 SDRAM SRAM DRAM PSRAM xff0c NOR Flash Nand Flash不同 TablesChineseFull NameSDRAMab
  • ROS笔记(一)xxx.launch文件详解

    ROS笔记 一 xxx launch文件详解 launch文件是ROS中用于同时启动多个节点的重要文件 在大型的ROS项目中使用频繁 所以掌握其主要元素与属性对ROS系统的应用至关重要 xff1a launch标签 元素 说明launch拓
  • 【OpenCV/aruco】第一个AR Demo-二维图片

    说在前面 操作系统 xff1a win10 vs 版本 xff1a 2017 opencv版本 xff1a 4 0 1 opencv contrb版本 xff1a 4 0 1 接上篇 xff1a OpenCV aruco 校准相机 Came
  • 学C++就学服务端,先把apue和unp两卷看了,接着libevent,出来找工作应该没问题

    学C 43 43 就学服务端 xff0c 先把apue和unp两卷看了 xff0c 接着libevent xff0c 出来找工作应该没问题
  • 详解双闭环控制算法(理论篇)

    什么是双闭环控制 双闭环控制算法是一种先进的控制方法 xff0c 它针对控制系统中存在的多种干扰和变化进行优化 xff0c 提高系统的稳定性 精度和响应速度 双闭环控制算法由内环和外环组成 xff0c 分别控制系统的快速响应和系统稳定 内环
  • rtthread中使用sqlite

    一 简介 SQLite是一款嵌入式 轻量级的关系型数据库系统 xff0c 它的设计目标是嵌入式的 xff0c 而且目前已经在很多嵌入式产品中使用了它 它占用资源非常的低 xff0c 在嵌入式设备中 xff0c 可能只需要几百K的内存就够了
  • Pycharm报错:ERROR: Command "python setup.py egg_info" failed with error code 1

    今天在调试程序的时候 xff0c Pycharm报了这个错 xff0c 然后自己弄了半天 最后发现其实原因在一个很简单的地方 xff0c 我却没发现 下面开始介绍怎么处理这个错误 xff0c 只是有可能的解决方法 xff0c 不一定适合所有
  • ubuntu下串口发送或者接收(c语言实现)minicom调试

    关于串口的知识这里就不累赘了 xff0c 看着多又烦 xff0c 搞这个的都懂串口 xff0c 不多废话了 xff01 xff01 进入正题 xff01 xff01 1 选择合适的usb串口模块 某宝很多这种模块 xff0c 有各种型号的

随机推荐

  • 解决ssh登录,找不到匹配的host key算法

    使用SSH登录某台机器 xff0c 有时因为server端的一些变动 xff0c 会出现以下信息 xff1a 找不到匹配的host key算法 xff08 此处先不提及原理 xff0c 只讲处理方法 xff0c 需要了解原因的请留言或找其他
  • Kubernetes集群监控方案

    文章目录 前言一 Prometheus是什么 Prometheus简介 xff1a Prometheus的特点 xff1a Prometheus相关组件 xff1a 二 在k8s集群的所有节点上下载所需要的image三 采用daemonse
  • stm32 VBAT通过锂电池实现断电保持电路 不用纽扣电池

    对于一些通过锂电池供电的小型穿戴设备如手表 通过锂电池实现后备电池不断电 电池电源通过4148二极管降压到3 3V提供后备电源 就不需要加纽扣电池了 可以节省空间
  • STM32配置外设时,外设结构体寄存器缺省带来的后果。

    今天在调试定时器 xff0c PWM输入捕获的功能时 xff0c 奇怪的发现 xff0c 在某一处多添加一句语句导致改变了定时器模式的配置 正常情况下 xff0c 我们配置外设的时候 xff0c 都会采用这样的方式 xff1a span c
  • STM32以太网通信-LWIP简介

    LwIP全名 xff1a Light weight IP xff0c 意思是轻量化的TCP IP协议 xff0c 是瑞典计算机科学院 SICS 的Adam Dunkels 开发的一个小型开源的TCP IP协议栈 LwIP的设计初衷是 xff
  • ubuntu笔记本外置显卡开展深度学习(转载)

    来源知乎 xff1a https zhuanlan zhihu com p 102359826
  • Linux 下c语言ftp服务器简单实现

    这个程序转载自http aijiekj blog 163 com blog static 12986678920112321853230 原来的程序没有注释 xff0c 最近这段时间在学习网络编程这块 xff0c 就在网上找了个程序来学习
  • 警告!你的隐私正在被上亿网友围观偷看!

    你的隐私正在被上亿万网友围观偷看 xff01 事情要从一款被推荐到烂的软件说起 Everything 这个软件想必很多同学都有听过 xff0c 是一款非常好用的文件搜索软件 xff0c 很多同学把它设置为开机必启动项之一 简单来说 Ever
  • 工作中遇到的C中Sscanf 函数的用法详解

    1 首先 xff0c 看到sscanf时 xff0c 会想到scanf xff0c 唯一不同的是前者是以固定的字符串为输入源 xff1b 后者是以屏幕为输入源 2 sscanf函数的定义为 int sscanf const char str
  • C 语言中结构体中成员所占内存的大小

    在C99标准中 xff0c 对于内存对齐的细节没有作过多的描述 xff0c 具体的实现交由编译器去处理 xff0c 所以在不同的编译环境下 xff0c 内存对齐可能略有不同 xff0c 但是对齐的最基本原则是一致的 xff0c 对于结构体的
  • 工作中遇到的一些SVN恶心的问题处理方法,解决问题的小妙招来了!---致刚刚参加的工作的青涩的人

    1 如果你已经参加了工作 xff0c 难免而且一定要用户svn xff0c 很多公司都会选择它来管理公司的项目 xff0c 这时懂的svn的用法会让你的工作事半功倍的 相信你一定为遇到上传失败 更新失败 clean up 失败而烦恼 xff
  • 麻将胡牌的算法

    清一色是麻将的种类之一 xff0c 指有一种花色的序数牌组成的胡牌 数字1 9 xff0c 每个数字最多4张牌 xff1b 我们不考虑具体的花色 xff0c 我们只看数字 刻字 xff1a 三张一样的牌 xff1a 111 222 333
  • 进程和线程的区别、相同点

    1 首先是定义 进程 xff1a 是执行中一段程序 xff0c 即一旦程序被载入到内存中并准备执行 xff0c 它就是一个进程 进程是表示资源分配的的基本概念 xff0c 又是调度运行的基本单位 xff0c 是系统中的并发执行的单位 线程
  • ORACLE日期数据类型

    oracle数据类型看起来非常简单 xff0c 但用起来会发现有许多知识点 xff0c 本文是我对ORACLE日期数据类型的一些整理 xff0c 都是开发入门资料 xff0c 与大家分享 xff1a 注 xff1a 由于INTERVAL及T
  • linux中shmget函数

    xfeff xfeff shmget int shmget key t key size t size int flag key 标识符的规则 size 共享存储段的字节数 flag 读写的权限 返回值 xff1a 成功返回共享存储的id
  • linux 中常用的数据库命令

    xfeff xfeff 1 显示数据库 show databases 2 选择数据库 use 数据库名 3 显示数据库中的表 show tables 4 显示数据表的结构 describe 表名 5 显示表中记录 SELECT FROM 表
  • socket编程accept函数返回值的理解

    accept函数返回值成功时返回非负值 xff0c 失败时返回 1 accept函数接受一个客户端请求后会返回一个新的SOCKFD值 xff0c 当有不同的客户端同时有不同请求时 xff0c 会返回不同的SOCKFD的值 这个不同的值和建立
  • 【TEE自学随笔】keystone代码略读(长文多图)

    武大信安在读 xff0c 最近在自学Risc v架构的可信执行环境 本篇内容由队友和我总结而成 xff0c 如有错误欢迎指正交流 keystone是risc v架构的开源tee 利用risc v的pmp来隔离页表 xff0c 进一步缩小了可
  • 二维数组与指针、指针数组、数组指针的用法

    二维数组 和指针 用指针表示二维数组 元素 要用指针处理二维数组 xff0c 首先要解决从存储的角度对二维数组 的认识问题 我们知道 xff0c 一个二维数组 在计算机中存储时 xff0c 是按照先行后列的顺序依次存储的 xff0c 当把每
  • 深剖基类和派生类的虚函数表

    1 当派生类实现基类的虚函数时 xff0c 基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数地址不同 xff1b 当派生类不实现基类的虚函数时 xff0c 基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数的地址相同 1 派生类重新实