你了解C++中的虚表吗
虚表
- 一、什么是虚表
- 二、虚表是干什么的
一、什么是虚表
在面试中,面试官会问到一个问题,影响一个类大小的因素有哪些?
这是我们就需要知道,影响一个类大小的因素首先就有成员变量,以及继承,以及最重要的一项就是虚函数,而这里的虚表就存放的是指向虚函数首地址的指针。
下面我们来看看虚表到底长什么样子
对于一个类而言,如果存在虚函数,就一定会有虚表指针,反之,则没有虚表。这个虚表指针指向的就是第一个虚函数的首地址,若存在第二个虚函数,则以此类推,以指针大小为偏移量,所以与其把虚表叫做虚表指针,不如叫做虚表指针数组。
二、虚表是干什么的
在谈虚表是干什么之前,我们先谈谈多态
多态是什么?
答:在不同继承关系的类对象中,去调用同一函数,产生了不同的行为。
多态的实现条件:
1.必须通过基类的指针或者引用调用虚函数。
2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
这里其实我们就会发现,多态的前提条件首先就是虚函数的重写,并且通过指针或者引用去调用虚函数。
下面我们就来看一下,为什么会出现多态
我们发现,对象b中的虚表存放的是B对象中的fun1和A对象中的fun2,是因为我们对基类中的fun1函数进行了重写。
重点来了
使用基类指针或者引用调用虚函数,并且该虚函数在派生类进行了重写,则就会产生多态,而虚函数的作用就是去定位每一个虚函数,包括覆盖重写的虚函数,从而定位虚函数,产生多态。
你了解C++中的虚表吗相关推荐
- C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址
C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当 ...
- C++中虚函数、虚指针和虚表详解
关于虚函数的背景知识 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类的对象都有一个指向虚表开始的虚指针.虚表是和类对应的 ...
- linux查看虚拟列表,C++类中虚表的详细讲解
C++类中的虚表结构是C++对象模型中一个重要的知识点,这里咱们就来深入分析下虚表的在内存中的结构. C++一个类中有虚函数的话就会有一个虚表指针,其指向对应的虚表,一般一个类只会有一个虚表,每个虚表 ...
- C++对象模型6——g++中虚继承的实现
虚基类的实现法在不同编译器之间差异极大.然而,每一种实现法的共同点在于必须能够在执行期准确描述虚基类在其每一个派生类中的位置. 一.虚继承的实现 struct A {int ax;virtual vo ...
- C++中虚函数与多态实现
多态,什么是多态?在计算机语言中,多态就是指一个接口或者方法,有多种展现形态.在C++中,通过父类指针调用子类方法,可以让父类指针有多种形态. C++中实现多态的方式有:虚函数,重载,模板,绑定等.此 ...
- 详解虚函数的实现过程之初探虚表(1)
空对象它有一字节的大小,在没有任何成员变量但是却有虚函数的对象里,它的大小是四个字节,这是为什么呢? 因为含有虚函数的对象里,对象的起始地址往后四个字节其实是 一个指针,它指向了一个数组,这个数组的元 ...
- 对于C++中多态的理解
对于C++中多态的理解 概述 函数的调用方式 静态绑定 动态绑定 动态绑定的条件 多态的用法 C++中多态的实现 参考 概述 OOP或者OOD的概念中,包含有复合composition,委托deleg ...
- 如何在不同开发语言中使用绑定变量_linux C/C++服务器后台开发面试题总结(编程语言篇)...
整篇分为四部分,篇幅较长,建议先收藏. 一.编程语言 1.根据熟悉的语言,谈谈两种语言的区别? 主要浅谈下C/C++和PHP语言的区别: 1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较 ...
- Aardio 第一天:使用虚表和适配器+试融合Java
初识 Aardio 挺洋气的名字,乍看神似arduino的重新排序.不过这是一种国人开发的脚本编程语言,自带基于win32 api的界面框架,可以和其他编程语言沟通,比如调用java或者python代 ...
最新文章
- excel了解mysql_对比Excel、MySQL、Python,分别讲述 “if函数” 的使用原理!
- SSH无法连上CentOS7的问题
- 探索Julia(part6)--基本命令与数学函数
- html2canvas 截图div_H5快照截图[html2canvas]+图片下载
- leetcode1091. 二进制矩阵中的最短路径(bfs)
- [Matlab] PDETool 的 Set Formula 的元素排列顺序会影响 Boundary 的判定
- 【今日CS 视觉论文速览】Wed, 30 Jan 2019
- Corona Enterprise 引入第三方 jar 包
- wampServer虚拟主机配置
- centos查看内存使用最多_CentOs中查看内存插槽数、最大容量和频率 查看内存插槽数、最大容量和频率...
- C语言求1到1000素数之和,C语言实现1-1000中所有素数的和
- 星之卡比镜之迷宫机器人_星之卡比镜之迷宫boss全方位攻略
- IOS开发使用@IBInspectable给控件添加额外属性
- 逆波兰式(后缀式)详解
- 微信公众号开发----测试号的使用
- PRML 2.1 二元变量
- 电子标签的制作及封装 射频标签通信协议简介 射频标签内存信息的写入方式
- 前端开发面试知识点大纲
- 数字化为何具有颠覆性?
- 给电脑重装系统的方法与重装过程中问题解决
热门文章
- Word文档如何自动生成目录
- 【3D建模制作技巧分享】zbrush贴图映射小技巧
- 手机数控模拟器安卓版_安卓版数控机床模拟器下载-安卓版数控机床模拟器高级手机版下载v1.0_信手游...
- 汽车市场增量,LED车用照明的渗透率如何?
- 单片机IO口输入模式
- VMware Tools 的dmg格式Download
- 赠书 | 2017年,新春快乐! 你对众筹感兴趣吗?
- delphi调用外部程序打开文件
- CreateEvent、CreateSemaphore、ReleaseSemaphore、CreateMutex
- 数据可视化分析教学课件——FineBI实验册节选====公共交通管理大数据平台