C++:虚函数

news2024/11/13 19:34:53

C++面向对象的三个特性,封装继承多态。在继承的关系中,所有的东西都可以被继承下来,如数据可以被继承下来在内存,而函数的继承则是继承调用权。

虚函数主要是通过虚函数表来实现,每个类都有自己的虚表,当你创建一个对象时候,对象的首地址处存放指向虚表的指针。下图是虚表的概念,其实不难。当子类继承父类的时候,会继承父类的虚函数表,这个时候如果在子类中重写父类中的虚函数,那么虚函数表中指向的函数地址也会发生改变,如果没有发生重写,则会指向原来的地址,以这种方式实现运行时候多态。

 

如果希望禁止子类重写虚函数,则需要声明final虚函数,被声明为 final 的类不能用作基类。

下面是以问题的方式来进行虚函数相关的学习。

1、虚函数如何实现的?会变慢吗?

虚函数是通过虚函数表实现的,每个类都有自己的虚表,对象的首地址处存放有指向虚表的指针。当具体调用哪个虚函数可以在编译期间确定的时候,虚函数不一定更慢。

2、构造函数、析构函数、重载运算符函数可以是虚函数吗?类成员函数模板可以是虚函数吗?

析构函数和重载运算符函数都可以是虚函数,但是构造函数不能是虚函数,因为构造函数是用来创建对象的,在创建对象期间,存放虚函数地址的虚表还没有创建完成,如果直接调用虚函数会引发异常。类成员函数模板不能是虚函数,因为C++在链接前是不知道成员函数模板被实例化多少次的,这就会导致编译器无法在编译期间确定虚表的大小。

3、为什么把析构函数定义为虚函数

如果释放父类指针指向子类对象的时候,析构函数不设置为虚函数就会只析构基类而不析构子类。会造成内存泄露。

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

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

相关文章

RevCol:大模型架构设计新范式,给神经网络架构增加了一个维度!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2212.11696.pdf 项目代码:https://github.com/megvii-research/RevCol 计…

把金融航母开进智能峡湾,总共分几步?

试想一下,有这么一家街头小店。夫妻两个勤奋经营,诚信待客,广受街里街坊的欢迎。他们流水稳定,蒸蒸日上,商业信誉很好,甚至是非物质文化遗产的传承者。这样一家店,在扩大经营,拓展业…

SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 …

C语言代码函数栈帧的创建与销毁(修炼内功)

目录 在前期的学习中我们可能有很多困惑 例如:局部变量是怎么创建的 为什么局部变量的值是随机值 函数是怎么样传参的 传参的顺序是什么 形参和实参的关系是什么 函数调用是怎么做的 函数掉调用结束后怎么返回的 这篇博客我们来修炼自己的内功,掌握好这篇…

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍 网格搜索、随机搜索和贝叶斯优化是寻找机器学习模型参数最佳组合、交叉验证每个参数并确定哪一个参数具有最佳性能的常用方法。 一、 评估指标 1、…

STM32F103基于HAL工程挂载FatFS驱动SD卡

STM32F103基于HAL工程挂载FatFS驱动SD卡 📌基于标准库驱动《STM32挂载SD卡基于Fatfs文件系统读取文件信息》 🎬驱动实验效果: 🔨通过STM32cubemx配置SPI1作为访问SD、TF卡通讯方式。 🔧在STM32cubemx配置中挂载中…

Scala入门【变量和数据类型】

目录 Scala基本认知 Hello Scala 方法的定义 伴生对象 Java: Scala: 2、变量和数据类型 2.1、注释 2.2、变量和常量 Java中的变量和常量 Scala基本语法 2.3、标识符 2.4、字符串 基本语法 2.5、标准输入输出 基本语法 2.6、文件的读写 …

6-8 二分查找

今天是端午节,祝大家端午节快乐~ 竟然这样,还不点点赞。 言归正传┏ (゜ω゜)☞ 目录 引入 二分查找算法思想 时间复杂度O(logN) 二分查找算法描述 二分查找算法的框架如下: 例题1: 例题2&#x…

秒懂SpringBoot之如何集成SpringDoc(全网目前最新最系统最全面的springdoc教程)

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 文章目录 概述概念解释SpringDoc使用简单集成配置文档信息配置文档分组使用注解TagOperationSchemaParameterParametersApiResponses 和ApiResponse 认证授权无需认证需要认证 总结源码 概述 近来颇为懈…

13. WebGPU 正交投影

在上一篇文章中,讨论了矩阵的工作原理。讨论了如何通过 1 个矩阵和一些神奇的矩阵数学来完成平移、旋转、缩放,甚至从像素到裁剪空间的投影。实现 3D 操作 只需要再向前迈一小步。 在之前的 2D 示例中,将 2D 点 (x, y) 乘以 3x3 矩阵。要实现…

【机器学习】——续上:卷积神经网络(CNN)与参数训练

目录 引入 一、CNN基本结构 1、卷积层 2、下采样层 3、全连接层 二、CNN参数训练 总结 引入 卷积神经网络(CNN)是一种有监督深度模型框架,尤其适合处理二维数据问题,如行人检测、人脸识别、信号处理等领域,是带…

19c rac添加节点

在正常的节点 [rootdb1 ~]# xhost access control disabled, clients can connect from any host [rootdb1 ~]# su - grid ASM1:/home/griddb1>export DISPLAY:1.0 ASM1:/home/griddb1>$ORACLE_HOME/gridSetup.sh [rootdb2 ~]# /tmp/GridSetupActions2021-09-16_…

基于Nginx1.22+PHP8+MySQL8安装Discuz! X3.5

基于Nginx1.22PHP8MySQL8安装Discuz! X3.5 1. 安装PHP82. 安装MySQL83. 配置Nginx1.224. 安装Discuz! X3.5 1. 安装PHP8 更新系统: yum update安装EPEL存储库: yum install epel-release安装Remi存储库(提供了最新的 PHP 版本)&…

【十三】druid 原理解析

druid 原理解析 先前写了一篇博客关于druid集成相关的,这里来分析一下druid原理,结合这两篇文章希望读者能够把druid理解透彻。 一、druid介绍 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能&…

【前端JS交互篇】ECMA核心语法 ——常量、变量、数据类型、各种弹框

一、javascript简介 1.1 Javascript简史 在WEB日益发展的同时,网页的大小和复杂性不断增加,受制于网速的限制,为完成简单的表单验证而频繁地与服务器交换数据只会加重用户的负担,当时走在技术革新最前沿的Netscape(网…

阿里云服务器的弹性计算能力如何?是否支持按需扩展和缩减?

阿里云服务器的弹性计算能力如何?是否支持按需扩展和缩减?   【本文由阿里云代理商[聚搜云www.4526.cn]撰写】   阿里云服务器,作为业界领先的云计算服务提供商,其弹性计算能力是如何体现的?是否真的支持按需扩展和…

定制你的Blocks UI布局:Gradio的Block Layouts模块介绍

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

【python】如何在 Python 中创建相关矩阵

目录 一、说明 二、相关理论 2.1 何为相关 2.2 相关的前提 2.3 Correlation Matrix是个啥? 2.4 皮尔逊相关系数 三、Python演示如何创建相关矩阵 四、数据可视化观察 五、后记 一、说明 本教程介绍如何在 Python 中创建和解释相关矩阵。然而,创…

English Learning - L3 作业打卡 Lesson7 Day47 2023.6.20 周二

English Learning - L3 作业打卡 Lesson7 Day47 2023.6.20 周二 引言🍉句1: Growing up in a hot Las Vegas desert, all I wanted was to be free.成分划分弱读连读语调 🍉句2: I would daydream about traveling the world, living in a place where i…

有三个线程,分别只能打印A,B和C要求按顺序打印ABC,打印10次(多种方法,小白也懂)

目录 第一种方法:使用LockSupport的park和unpark功能(推荐) 第二种方式:synchronizedwaitnotify 第三种:暴力循环方法(不推荐) 第一种方法:使用LockSupport的park和unpark功能(推荐) 简单来说我们有一个名为LockSupport的方法 park就是阻塞当前进程 unpark就是取消阻塞让其…