虚函数表、函数地址、虚函数指针问题!

2023-10-26

一、虚函数

1. 虚函数的写法:函数前+ virtual 关键字:

  • virtual fun(){cout<<" "<<endl;}————虚函数;
  • virtual fun()=0————纯虚函数;

2. 虚函数的目的:有些对象类型只有在运行程序时才能确定,通过虚方法能够实现在程序运行时根据对象类型调用实际的函数,从而实现动态多态的目的。

二、虚函数的工作原理

1. 虚函数表:若一个类中包含虚函数,则在编译期,就会生成一个虚函数表,这个虚函数表存放的是所有虚函数的函数地址

注意:虚函数表属于类,所有相同类的对象共享一个虚函数表!!不同的类有不同的虚函数表。

2. 虚函数指针编译期间,为虚函数指针开辟空间运行时,构造函数实例化对象,此时虚函数指针被初始化,编译器会把虚函数表的首地址赋值给虚函数表指针

注意:同一个类的不同对象的虚指针相同,不同类的对象的虚指针不同。

3. 原理

  • 虚指针与对象有关;
  • 基类存在虚函数,则存在一个虚函数表和一个虚函数指针,派生类不管是否重写,也会存在一个虚函数表和一个虚函数指针;
  • 如果派生类重写基类函数,则派生类虚函数表与基类虚函数表关系如下:此时通过父类指针调用子类的方法时,通过子类的指针找到的是重写后的函数的地址,因此不会实现父类的虚函数。
  •  如果派生类不重写基类的虚函数,则情况如下:此时派生类的指针指向与父类指针指向的函数地址相同,执行父类的虚函数。

另:三、构造函数不能为虚函数的原因

构造函数的目的:对象实例化。

                        对象实例化的方法有两种:赋值初始化、列表初始化。

对于赋值初始化:先为对象分配空间,再为对象进行初始化;

对于列表初始化:在为对象分配空间的同时为对象进行初始化;

总之,构造函数的目的就是实现对象的实例化、初始化。

由上可知,虚指针是跟对象有关的,在构造函数未执行之前,对象是没有实例化、初始化的,因此,虚指针的指向是不知道的,因此,构造函数作为虚函数是没有任何意义的;

而且,构造函数也是不能继承的,所以不可能实现多态的机制,因此构造函数初始化是不必要的。

 

 

 

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

虚函数表、函数地址、虚函数指针问题! 的相关文章

随机推荐

  • 如何用ai写文章?这三个软件可以自动生成文章

    随着人工智能技术的不断发展 ai写作已经成为了当今的热门话题 它是指利用机器学习 自然语言处理等技术 让机器能够像人类一样写作 相较于传统写作方式 ai写作大大提高了写作的效率和质量 可以让我们的创意和技术相融合 其应用范围也非常广泛 无论
  • 探索编程世界的宝藏:程序员必掌握的20大算法

    程序员必须掌握哪些算法 文章目录 1 引言 2 冒泡排序算法 编程世界的排序魔法 3 选择排序算法 排序世界的精确挑选器 4 插入排序算法 排序世界的巧妙插珠者 5 快速排序算法 排序世界的分而治之大师 6 归并排序算法 排序世界的合而为一
  • 统计并输出该字符串中26个英文字母

    字符串 第3题 描述 输入一个字符串 统计并输出该字符串中26个英文字母 不区分大小写 出现的次数 输入 输入一个字符串 输出 分行输出26个英文字母 不区分大小写 出现的次数 输入示例 I am a student 输出示例 a 2 d
  • Python:蒙特卡罗方法模拟解决三门问题

    蒙特卡罗方法与三门问题 蒙特 卡罗方法 Monte Carlo method 也称统计模拟方法 是一种统计学的方法 模拟方法 通过大量随机样本模拟问题 从而获得所要计算的值 三门问题 三门问题 Monty Hall problem 亦称为蒙
  • STM32:TIM_OCxInit函数用法解释

    TIM OC3Init函数是用于初始化定时器TIM的PWM输出通道3的函数 可以使用以下步骤进行使用 创建一个TIM OC InitTypeDef类型的结构体对象 例如命名为TIM OCInitStruct 使用TIM OCStructIn
  • 网络基础知识总结

    一 广域网和局域网 局域网 Local Area Network 简称LAN 也就是内网 局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组 它可以是邻居之间的2台电脑 也可以是一幢100层大楼
  • [深入研究4G/5G/6G专题-41]: URLLC-12-《3GPP URLLC相关协议、规范、技术原理深度解读》-6-MAC层调度器的总体架构、调度器的原理和三种URLLC调度器的增强方案

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文主页 https blog csdn net HiWangWenBing article details 125942872 目录 前言
  • 杭电ACM 1000题

    import java util Scanner public class Main public static void main String args Scanner cin new Scanner System in while c
  • ajax 跨域 session 丢失问题

    ajax 跨域时session丢失了 解决方法 首先我 Google 了一下这个问题的原因 我找到了这个 1 Access Control Allow Origin该字段是必须的 它的值要么是请求时Origin字段的值 要么是一个 表示接受
  • Cookie与前端安全

    目录 一 Cookie的作用 二 cookie与http协议 1 http响应 cookie的生成 2 http请求 cookie的发送 三 Cookie的属性 1 Expires Max Age 2 Domain Path 3 Secur
  • 30分钟速成TypeScript

    一 TypeScript 是什么 TypeScript 是 JavaScript 的超集 在 JavaScript 的基础上增加了类 模块 接口 泛型和静态类型 可选 等常见的概念 从编程语言的动 静来区分 TypeScript属于静态类型
  • JS代码风格利器——Eslint

    ESLint 是一个开源的 JavaScript 代码检查工具 由 Nicholas C Zakas 于 2013 年 6 月 创建 代码检查是一种静态的分析 常用于寻找有问题的模式或者代码 并且不依赖于具体 的编码风格 对大多数编程语言来
  • 网易云音乐首页导航样式的实现

    实现效果图 背景图片
  • xml sax localName和qName的区别

    对于DefaultHandler类中方法的成员 String uri String localName String qName Attributes attributes 弄的不是很清楚 于是得到下面这片文章感觉讲的蛮清楚的 无节操的贴过
  • CSS动画实现的三种方式

    CSS动画 CSS动画就是元素从一种样式过渡到另一种样式的过程 常见的动画效果很多 比如 平移 缩放 旋转等 CSS实现动画的方式有以下几种 transition 实现渐变动画 transform 实现缩放 平移等效果 animation
  • 金币收集问题

    金币被放在1到n编号的格子中 一个人从第一个格子出发 有m张卡片 共4种 卡片上的数字1 4 表示可以走的步数 求到达终点获得的最大金币数 import java util public class Main public static v
  • linux内核设计与实现思想 – C风格的面向对象

    原文链接 linux内核学习 C风格的面向对象 linux内核大量使用面向对象的编码风格 然而linux内核是完全使用C写就 学习他们如何使用C模拟面向对象机制很有意思 这种做法很可能被人贬为扯淡 但是的确使用C模拟面向对象机制 使得程序员
  • 异常检测

    异常检测 MATLAB实现Bayes贝叶斯突时间序列变检测 目录 异常检测 MATLAB实现Bayes贝叶斯突时间序列变检测 基本描述 程序设计 参考资料 学习总结 致谢 基本描述 突变分为如下主要的几种 均值突变 最常见 方差突变 线性回
  • Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update

    进行数据库操作时 报错如下 org springframework orm hibernate5 HibernateOptimisticLockingFailureException Batch update returned unexpe
  • 虚函数表、函数地址、虚函数指针问题!

    一 虚函数 1 虚函数的写法 函数前 virtual 关键字 virtual fun cout lt lt lt