当前位置: 首页 > news >正文

C++多态常见面试题

1.什么是多态

简单点说,就是多种形态,具体就是完成某个行为,当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态,静态多态一般指的是函数重载,在编译阶段通过函数名修饰规则,不同类型调用不同函数。动态多态指的是在运行阶段父类的指针或者引用通过续表调用不同的虚函数的过程。

2.什么是重载,重写,重定义

  • 函数重载:两个函数在不同作用域,函数名相同,参数不同(个数不同,顺序不同,类型不同)
  • 重写/覆盖:两个函数分别在基类和派生类作用域,且必须都是虚函数,并且两个函数的返回值,函数名,参数相同(协变例外)
  • 隐藏/重定义:两个函数分别在基类和派生类的作用域,函数名相同就构成隐藏(函数名相同的情况下不构成重写就构成隐藏)

3.多态的实现原理

能实现多态的最大功臣可以说是虚函数表了,每个类对象内部有一个续表指针,存储着当前对象内部的虚函数地址。当一个函数符合多态调用的时候,派生类会对从基类继承下来的续表进行重写,重写成父类的函数,此时基类和派生类中同一个函数地址便不一样了。当一个父类的指针或者引用调用该函数时,它会去当前对象续表指针里指向的续表去找虚函数,此时父类的指针或者引用指向基类则调用的函数便是基类的虚函数,指向派生类中则调用的是函数时派生类虚函数,从而当父类的指针或者引用不同父类或子类对象时,便调用不同的函数,完成不同的功能。

4.inline函数可以是虚函数吗?

  • 可以,如果是普通的虚函数,inline函数可以是虚函数。但如果这个函数构成了多态,此时这个虚函数需要放进续表,编译器会忽略inline的这个属性,此时函数便不再具备inline的特性。

5.静态函数可以是虚函数吗?

  • 不可以,静态函数里没有this指针,使用类型::成员函数无法访问虚函数表,所以静态成员函数无法放进虚函数表中。

6.构造函数可以是虚函数吗?

  • 不可以,因为虚函数表指针是在构造函数初始化列表阶段才初始化的

7.析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

  • 可以,并且非常建议把父类的析构函数设置为虚函数,防止产生内存泄漏问题。(class A : public B,B Node* = new A)

8.对象访问普通函数快还是虚函数快

  • 如果是普通调用一样快,如果是多态调用,普通函数快,多态调用要通过续表找地址,会有一定程度的效率损耗。

9.虚函数表是在什么阶段生成的,存在哪里?

  • 在编译阶段生成,虚函数表指针在构造函数初始化列表初始化,存在代码段/常量区

10.C++菱形继承的问题?虚继承的原理

  • C++菱形继承会产生数据冗余和二义性问题。菱形虚拟继承更改了数据模型,把公共的虚基类放在当前对象模型的最下面,同时对象模型里产生了虚基类指针指向虚机表。在这个表中存有当前位置离虚基类的偏移量,通过偏移量和当前位置的地址找到公共的存放虚基类成员变量的地址。

11.什么是抽象类?抽象类的作用?

  • 包含纯虚函数的类是抽象类,抽象类不能实例化对象,所以抽象类强制了子类要对基类的纯虚函数进行重写虚。此外抽象类还体现了接口继承。

相关文章:

C++多态常见面试题

1.什么是多态 简单点说,就是多种形态,具体就是完成某个行为,当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态,静态多态一般指的是函数重载,在编译阶段通过函数名修饰规则,不同类型调用不同…...

字母板上的路径 题解,力扣官方出来挨打(小声)

字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动&#xff1a…...

代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串

一、参考资料组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解:https://programmercarl.com/004…...

vueday01-脚手架安装详细

一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具,安装后运行 vue --version ,如果看到版本号,说明安装成功或 vue -V工具安装好之后,就可以安装带有webpack配置的vue项目了。创建项目之前&#…...

初识cesium3d(一)

使用ViteVue3.2Cesium。Vite需要Node.js版本14.18及以上版本。Vite命令创建的工程会自动生成vite.config.js文件,来配置一些相关的参数。 1、使用Vite创建vue3项目 # npm npm init vitelatest cesium-app -- --template vue # yarn yarn create vite cesium-app…...

点云转3D网格【Python】

推荐:使用 NSDT场景设计器 快速搭建 3D场景。 在本文中,我将介绍我的 3D 表面重建过程,以便使用 Python 从点云快速创建网格。 你将能够导出、可视化结果并将结果集成到您最喜欢的 3D 软件中,而无需任何编码经验。 此外&#xff0…...

【OpenCV图像处理系列一】OpenCV开发环境的安装与搭建(Ubuntu + Window都适用)

🔗 运行环境:OpenCV,Ubuntu,Windows 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### &#x…...

【代码随想录】-动态规划专题

文章目录理论基础斐波拉契数列爬楼梯使用最小花费爬楼梯不同路径不同路径 II整数拆分不同的二叉搜索树背包问题——理论基础01背包二维dp数组01背包一维数组(滚动数组)装满背包分割等和子集最后一块石头的重量 II目标和一和零完全背包零钱兑换 II组合总和…...

c++数据类型 输入输出

C++语法 //常用包: iostream:cin cout endl cstdio:scanf printf algorithm:max min reverse swap cstring:memset memcpymemset(a,-1,sizeof a) 填充数组memcpy(b,a,sizeof a) 将a数组复制到b数组,长度是a数组字节长度 cmath:sin sqrt pow abs fabs编程是一种控制计…...

【设计模式-11】责任链模式

认识设计模式(十一)---责任链模式【一】责任链模式【二】介绍(1)意图(2)主要解决(3)何时使用(4)如何解决(5)关键代码(6&am…...

SpringBoot+Vue实现智能物流管理系统

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...

【MT7628】MT7628如何修改串口波特率、调试串口物理口、使用UART3口

环境说明 sdk版本:Mediatek_ApSoC_SDK_4320_20150414.tar.bz2 芯片方案:MT7628A Uboot修改串口波特率方法 修改rt2880.h文件 修改include/configs/rt2880.h文件CONFIG_BAUDRATE宏的值 - #define CONFIG_BAUDRATE 57600 +#define CONFIG_BAUDRATE 115200 Kernel中修改串口波特…...

css盒模型介绍

在使用CSS进行网页布局时,我们一定离不开的一个东西————盒子模型。盒子模型,顾名思义,盒子就是用来装东西的,它装的东西就是HTML元素的内容。或者说,每一个可见的 HTML 元素都是一个盒子,下面所说的盒子…...

onetab 谷歌插件历史数据清除

文章目录方法1:测试也可以步骤1:批量执行点击步骤2:python 脚本模拟点击确定操作方法2:成功【推荐】步骤1:修改confirm,类似于hook操作步骤2:批量点击删除操作:onetab 谷歌插件历史数…...

GRBL源码简单分析

结构体说明 GRBL里面的速度规划是带运动段前瞻的,所以有规划运动段数据和微小运动段的区分 这里的“规划运动段”对应的数据结构是plan_block_t,前瞻和加减速会使用到,也就是通过解析G代码后出来的直接直线数据或是圆弧插补出来的拟合直线数据…...

第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(谓语动词的情态)

二、简单句的核心变化 简单句的核心变化其实就是 一主一谓(n. v.) 表达一件事情,谓语动词是其中最重要的部分,谓语动词的变化主要有四种:三态加一否(时态、语态、情态、否定),其中…...

软考高级考试中有五大证书,其中哪个更值得考?

计算机软考属于专业技术人员职业资格水平评价类,是职业资格、专业技术资格(职称)和专业技术水平"三合一"的考试,是目前IT行业仅有的国家级考试。考试不受学历、专业、资历等条件限制。软考高级考试中有五大证书&#xf…...

FlexRay™ 协议控制器 (E-Ray)-04

网络管理 累积的网络管理 (NM) 向量位于网络管理寄存器 1 到网络管理寄存器 3 (NMVx (x = 1-3)) 中。【The accrued Network Management (NM) vector is located in the Network Management Register 1 to Network Management Register 3 (NMVx (x = 1-3)).】 网络管理向量 x…...

container_of 根据成员变量获得包含其的对象的地址!

写在前面 本系列文章的灵感出处均是各个技术书籍的读后感,详细书籍信息见文章最后的参考文献 CONTAINER_OF 在书中发现一个很有意思的宏,以此可以衍生出来其很多的用法,这个宏可以根据某个成员变量的地址得到包含这个成员变量地址的对象的…...

Linux进程概念

Linux进程概念前言冯诺依曼体系操作系统设计操作系统的目的如何理解OS是一款搞“管理”的软件?系统调用和库函数的概念进程的概念描述进程组织进程查看进程fork()前言 本篇博客主要介绍一些:冯诺依曼体系、OS的理解、进程的一些概…...

3种方法永久保存QQ空间历史说说:GetQzonehistory实战指南

3种方法永久保存QQ空间历史说说:GetQzonehistory实战指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 为什么需要GetQzonehistory:三个真实场景 想象一下&am…...

# Trae IDE `settings.json` 配置详解与教学文档

Trae IDE settings.json 配置详解与教学文档 一、文档说明 本文档针对 Trae IDE 中 Java 开发核心配置文件 settings.json 进行逐字段解读,结合实际开发场景说明配置目的、作用及最佳实践,适配 Spring Boot + Maven + JDK21 技术栈。 二、配置文件整体作用 settings.json…...

npm install 背后的依赖管理机制:为什么你的node_modules这么大?

npm install 背后的依赖管理机制:为什么你的node_modules这么大? 每次运行 npm install 后,看着飞速增长的 node_modules 文件夹,你是否曾好奇过这个"黑洞"究竟是如何形成的?今天我们就来揭开Node.js依赖管理…...

7-Zip ZS:六种压缩算法如何彻底改变你的文件处理体验

7-Zip ZS:六种压缩算法如何彻底改变你的文件处理体验 【免费下载链接】7-Zip-zstd 7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard 项目地址: https://gitcode.com/gh_mirrors/7z/7-Zip-zstd 在数字时代,文件压缩已…...

前后端分离毕设架构指南:从技术选型到生产级落地

前后端分离架构如今已成为现代Web开发的标配,但对于即将进行毕业设计的同学来说,如何从零开始搭建一个结构清晰、易于维护的毕设项目,却是一个不小的挑战。很多同学在项目初期雄心勃勃,但在开发过程中却常常陷入接口文档缺失、前后…...

Logisim-evolution完全指南:跨平台安装与配置实战

Logisim-evolution完全指南:跨平台安装与配置实战 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 准备阶段:从零开始的环境搭建 1.1 认识Logisim…...

从零开始学计算机视觉|CV 基础算法与项目实战

大家好,我是唐宇迪,资深AI讲师与学习规划师。专注计算机视觉教学与算法研发,过去三年我帮超过2500名有Python基础的入门者,从“像素是什么”到“独立跑通CV项目”。今天这篇长文,完全按零基础实战体系撰写,…...

实测AWS Bedrock 接入 Claude 4.6 做代码审查:200K 上下文+多智能体协作

最近 GitHub 上的不少热门开源项目都在热议一款新工具:Anthropic 刚刚在 AWS Bedrock 推出的 Claude 4.6 Sonnet,以及随之而来的多智能体代码审查系统(Claude Code Review)。这套系统不仅卷起了技术圈的讨论热潮,也掀起…...

【北约】认知雷达信号处理 Cognitive Radar Signal Processing

本文仅供学习使用如有侵权,请联系本人删除 This article is for educational purposes only. If there is any copyright infringement, please contact me to have it removed....

RePKG:解锁Wallpaper Engine壁纸资源的三大核心功能

RePKG:解锁Wallpaper Engine壁纸资源的三大核心功能 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经看着Wallpaper Engine里精美的动态壁纸,想要提…...