虚机制

news2024/11/26 22:19:23

一、虚机制的引入

在这里插入图片描述

在这里插入图片描述

利用动态编联实现——虚函数来解决上述问题

在这里插入图片描述

二、虚函数

在这里插入图片描述
必须是实例方法,不能是类方法。

在这里插入图片描述

  • 若基类中析构函数为虚函数,则派生类中的析构函数不论写不写virtual关键字都是虚函数。
  • 派生类中新的虚函数应尽量避免与基类中的虚函数重名。

三、虚函数表

1、引入:
在这里插入图片描述
2、定义:
在这里插入图片描述

  • 说明中的第一点,虚函数可以是自己定义的也可以是从基类中继承的
  • 说明中的第四点,派生类中的前几个,顺序与基类中定义的函数顺序相同,然后才是派生类中自己定义的函数。

在这里插入图片描述

  • 若在基类的Show()函数前加上virtual关键字,运行结果不变
  • vptr虚拟表指针,指向虚拟表。

四、虚机制的作用机制

1、
在这里插入图片描述

  • sh1静态类型为Shape类型,动态类型为矩形;psh2静态类型为Shape指针类型,动态类型为圆的指针类型。
    在这里插入图片描述
  • Func可能不被调用,因为通过虚拟表找到的未必就是Func函数。

EX1:
在这里插入图片描述

  • 标红的代码部分,需注意p1、p2的静态类型都是A类,而在A类中是找不到f1()的,因此编译报错。

EX2:
在这里插入图片描述

  • Date类析构函数加virtual关键字的原因:如果不加virtual关键字则不会采用虚机制,在delete pDate1的时候就不会调用派生类的析构函数,而是直接释放基类的析构函数。

五、虚函数的访问

在这里插入图片描述

  • 给p2发送的消息X仅限于f、g、k,因为p2的静态类型为A类,而在A类中无h函数。
  • 若给p2发送消息f,则找到B类中的f,而B中f大括号内的g()和k()全部视为this->g()/k(),其中this->g()找到A类中,g()中的k()视作this->k(),也是A类中的k(),非虚函数为静态编联。而f中的this->k()在B类中,其中的h()视作this->h(),仍在B类中,非虚函数为静态编联。

在这里插入图片描述

示例:

在这里插入图片描述

  • p->vf()时,输出Derived::vf()。
  • p->vg()时,由于派生类中没有vg(),只有基类中有,且基类中为虚函数,所以动态编联,而动态类型为派生类类型,所以其中的this->vf()为派生类中的vf,同样输出Derived::vf()。
  • p->nvh()时,由于静态类型Base中nvh()为非虚函数,所以其实现全部在基类中完成。
    输出:
Base::nvh()
Base::vf()
  • delete p时,由于p是Base类指针,所以先调用Base类的析构函数,而其为虚函数,所以动态编联执行派生类的析构函数,执行vf(),最后再执行基类析构函数中的vf().
    输出:
Derived::vf()
Base::vf()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基础知识——24.泛型

这篇文章我们来讲一下java的泛型 目录 1.什么是泛型 1.1 泛型的概念 1.2 泛型的好处 1.3 粗看泛型集合的源码 2.泛型类 2.1 泛型类的定义 2.2 从泛型类派生子类 3.泛型接口 4.泛型方法 5.类型通配符 5.1类型通配符上限 5.2 类型通配符的下限 6.类型擦除 6.1无限…

HTML(三) -- 表单设计

目录 1. 基本语法 2. 表单控件 2.1 input控件 input 常用属性: input type的表单项: 2.2 select 控件 2.3 textarea控件 2.4 label 控件 为什么需要表单? 在我们网页中, 无论是提交搜索的信息,还是网上注…

线程池核心线程是如何保持住的?

概述 本文尝试回答以下几个问题: 1、核心线程池是如何保持住的? 2、当没有任务时,超过核心线程数的线程是如何回收的? 3、线程队列为什么必须是BlockingQueue,普通队列行不行? 背景知识 以下是一些背景知…

第十三章 移动和旋转(上)

移动和旋转是游戏对象最频繁地操作。我们上个章节简单介绍了Cube的移动和旋转。移动是修改transform的position属性,旋转是修改transform的eulerAngles(欧拉角)属性,两者属性值均可以使用Vector3向量来实现。需要大家注意的是&…

C#窗体将DGV控件中数据导入导出Excel表

目录 界面图: 效果视频: 一:将DGV数据导出到Excel表中 二:将Excel表数据导入到DGV中 三:界面全部代码 界面图: 效果视频: DGV数据导入导出Excel 一:将DGV数据导出到Excel表中 p…

私人影院 - 本地搭建Emby媒体库服务器并在外远程访问 「无需公网IP」

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

用ChatGPT问DotNet的相关问题,发现DotNet工程师的前景还不错

本人最近费了九牛二虎之力注册了一个ChatGPT账号,现在就给大家分享一下,问一下关于.NET的问题,看看ChatGPT的AI功能具体如何? 一、C#跟其它语言比较的优势 回答: C#是一门编程语言,它是为 Microsoft 的 …

【Linux】动态库与静态库

目录 一、前言 二、静态库与动态库 三、生成静态库 1、生成原理 2、完整过程 3、总结 四、生成动态库 1、环境变量 2、建立软链接 3、配置文件 五、动态库的加载 1、动态库加载的过程 2、动态库地址的理解 3、补充内容 一、前言 关于动态库与静态库的一小部分前置…

TCP的粘包和拆包

UDP有数据边界,TCP是没有数据边界,是流协议。如何拆包,就要靠应用层来处理。 四层网络模型,消息在进入每一层时都会多加一个报头。mac头部记录的是硬件的唯一地址,IP头记录的是从哪来和到哪去,传输层头记录…

GPT 护理机器人 - 让护士的工作变简单

引子    书接上文《GPT接入企微应用 - 让工作快乐起来》,我把GPT接入了企微应用,不少同事都开始尝试起来了。有的浅尝辄止,有的刨根问底,五花八门,无所不有。这里摘抄几份: “帮我写一份表白信&#xff…

Github 的使用

3. Github 在版本控制系统中,大约90%的操作都是在本地仓库中进行的:暂存,提交,查看状态或者历史记录等等。除此之外,如果仅仅只有你一个人在这个项目里工作,你永远没有机会需要设置一个远程仓库。只有当你…

嗯,这个树怎么和往常不一样?

文章目录 前言一、二叉树的链式存储二、二叉树链式结构的实现二叉树的结构设计手动构建二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历计算二叉树大小计算叶子节点个数计算二叉树高度计算第K层的节点个数查找某个值对应的节点二叉树的销毁 三、完整代…

全球首个存量手机直连卫星天地语音通话,打通了!

4月25日,美国卫星通信初创公司——AST SpaceMobile,宣布打通了全球首个天基蜂窝语音通话。 对于卫星通信乃至整个通信行业来说,这是一个重大新闻,非常值得关注。 去年,我们还只是实现了手机和卫星之间的双向短消息通信…

Page管理机制

Page页分类 Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率 Page根据状态可以分为三种类型: - free page : 空闲page,未被使用 - …

1.3 HBase 基本架构

架构角色: 1)Master 实现类为 HMaster,负责监控集群中所有的 RegionServer 实例。主要作用如下: (1)管理元数据表格 hbase:meta,接收用户对表格创建修改删除的命令并执行 (2&#x…

【C++ Primer(第5版) 课后习题题目及答案 第一章】

C Primer5th 课后习题答案 第一章 1.1:查阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行main程序。1.2:改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系…

C#弹出消息对话框,增加输入框,接受输入信息

效果图: 代码: using Microsoft.VisualBasic;string intext Interaction.InputBox("请输入密码","输入密码","",Screen.PrimaryScreen.Bounds.Width/4,Screen.PrimaryScreen.Bounds.Height/4);MessageBox.Show("in…

多商户商城系统开发功能有哪些?

多商户商城系统开发功能有哪些? 1、商品管理。商品管理是多商户商城系统的必备功能。商家需要能够轻松地添加、修改和删除商品。这个功能还应该包括商品图片、价格、描述和库存等信息的管理。消费者也需要能够通过小程序浏览商品并下订单。 2、订单管…

图形编辑器:历史记录设计

大家好,我是前端西瓜哥。今天讲一下图形编辑器如何实现历史记录,做到撤销重做。 其实就是版本号的更替。每个版本保存一个状态。 数据结构 要记录图形编辑器的历史记录,支持撤销重做功能,需要两个栈:撤销&#xff0…

【计算机网络】学习笔记:第三章 数据链路层【王道考研】持续更新中....

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…