面试宝典之C++多态灵魂拷问

news2024/11/30 2:50:50

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、重载,隐藏/重定义,覆盖/重写
  • 二、多态的原理
  • 三、inline可以是虚函数吗
  • 四、静态成员函数可以是虚函数吗
  • 五、构造函数可以是虚函数吗
  • 六、拷贝构造可以是虚函数吗
  • 七、赋值运算符重载可以是虚函数吗
  • 八、析构函数可以是虚函数吗

一、重载,隐藏/重定义,覆盖/重写

重载:同一作用域下的同名函数,需要返回值相同,参数列表不同构成重载

重定义/隐藏:继承关系中,子类与父类有同名函数就构成隐藏,只要名字相同,就构成隐藏,同时,析构函数也是特殊的同名函数。因为多态的需要,编译器会把它同一处理为destructor

重写:
重写具有两个条件:一是该函数在父类是虚函数,二是函数相同(返回值,函数名,参数列表),但是对于返回值而言,有特例,叫做重写的协变,具体请看C++中的多态(上),满足以上两个条件就是重写,不满足函数三同,那么虚函数就按普通函数处理,如果虚函数不是拿来完成多态,纯纯资源浪费,因为会创建虚表指针和虚表。

二、多态的原理

多态的原理就是多态调用是运行时决议,虚函数会创建一个虚表指针指向虚表(这个虚表在常量区中,可以通过打印地址看到)多态调用就会去查找虚表中的对应函数。所以子类完成虚函数重写,那么就可以通过父类的指针/引用来完成多态。

三、inline可以是虚函数吗

内联函数是可以为虚函数的,如果内联不是虚函数,那么构成内联的条件的话,在预编译阶段就会展开,不会进符号表,所以在链接的时候找不到定义,所以把内联函数怕的就是这个。但是,inline是建议性的关键字,加了virtual之后,编译器就忽略掉了inline。

四、静态成员函数可以是虚函数吗

①虚函数的调用过程:会先进入函数,因为虚函数是接口继承,所以父和子的接口都一样,随便进入一个,反正多态调用最后都会查虚表,该函数对应的虚表只有这一个,进入函数之后,通过this指针的方式,访问到虚表,从而进行调用,而静态成员函数的一大特点就是没有this指针,所以它也无法去通过多态调用。所以就算把静态成员函数存进虚表,也没有意义
②因为静态成员函数是可以通过指定类域的方式访问的 如A::func(); 说明它是编译时决议,你不管怎么多态,它在编译的时候就确定地址了,所以怎么也不会走到调用虚表这一地步。

五、构造函数可以是虚函数吗

①首先,虚构造函数是没有意义的,因为构造函数的名字和类名相同,所以并不会发生重写,所以构造函数如果是虚函数,只会浪费空间
②虚函数表和虚函数指针是在构造函数的初始化列表进行初始化的,因为构造函数只会在对象创建的时候调用一次,如果你去调用虚构造函数,那么进入构造函数就会调用this,找到虚表指针去查虚表(虚表是编译阶段就确定了的,因为编译器通过识别virtual来创建虚表,存在常量区),但是此时构造函数都还没有构造,虚表指针都找不到
所以构造函数不能是虚函数

六、拷贝构造可以是虚函数吗

①第一点同上,没有意义,浪费资源
②第二点也同上,因为还没有拷贝构造好,你就要调用我的虚表指针,我找不到

七、赋值运算符重载可以是虚函数吗

因为如果已经到赋值运算符重载了,说明对象以及构造好了,所以赋值运算符重载可以是虚函数

八、析构函数可以是虚函数吗

析构函数需要定义成虚函数,这是因为避免内存泄漏。如果不定义成虚函数,那么A*a = new B/A&a = b;(b是new出来的),他们就只能析构父类的部分,而子类新开辟的空间就没有被释放掉,导致内存泄漏,编译器为了能让析构函数完成重写,函数名会同一处理成destructor,然后调用的时候,只需调用子类的析构就可以了(父类的析构会在子类的析构之后自动调用,细节见C++中的多态(上))

在这里插入图片描述

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

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

相关文章

海丝一号-中国-2020

2020年12月22日,由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制,整星重量小于185kg,成像最高分辨率1m,可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 (Linux操作系统-2022的前面章节都为铺垫) 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合,此选项为短选项,–单词,此选项为长选项 Options选项&…

因果推断 | 双重差分法笔记补充

换了新的环境后,一直在适应(其实是一直被推着走),所以停更了笔记好久啦。这一周周末终于有点得空,当然也是因为疫情,哪里都不能去,哈哈,所以来冒个泡~ 整理了最近pre的作业&#xf…

ESP32-CAM初始篇:Arduino环境搭建-->实现局域网推流

ESP32-CAM初始篇:Arduino环境搭建–>实现局域网推流 入手产品:安信可科技:ESP32-CAM摄像头开发板: 相关产品特性请访问安信可ESP32-CAM官网:https://docs.ai-thinker.com/esp32-cam 第一步:下载Ardui…

基于51单片机数字频率计的设计

目录 前 言 1 第一章 总体设计方案 2 1.1 总设计框图 2 1.2 硬件设计分析 2 1.2.1 电源的设计 2 (4):LCD1602的指令说明及时序 10 (5): LCD1602的RAM地址映射及标准字库表 13 第二章 软件设计与分析 15 2.1…

谷粒商城十一商城系统及整合thymeleaf渲染商城首页

我们的商城系统本应该也是前后端分离的,就像后台管理系统那样,然而出于教学考虑,前后端分离的话就会屏蔽掉很多细节,所以我们进行服务端的页面渲染式开发(有点儿类似freemarker) 这些页面直接粘贴到微服务…

含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86500759 主要使用技术 ServletJSPcssjsMysqlTomcat 功能介绍 (1)前台功能模块: 注册登陆:顾客可以通过填写注册信息成为会员,登陆后才能进行购物车的管…

汽车 Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

基于Android的JavaEE课设

目录 1 技术栈 2 android前端 2.1 概述 2.1.1 目录结构 2.1.2 代码分层 2.2 技术点 2.2.1 数据绑定 2.2.2 前后端数据交互 2.2.3 九宫格图片 2.2.4 未处理消息提醒 2.2.5 动画效果 2.2.6 实时聊天 2.2.7 文件上传 2.2.8 底部弹窗 2.2.9 其他 3 后端 3.1 概述 …

BUUCTF Misc 假如给我三天光明 数据包中的线索 后门查杀 webshell后门

假如给我三天光明 下载文件,一个压缩包(需要密码)和图片 百度得知下面一行是盲文,根据盲文对照表 和上述图片对照,得到字符串:kmdonowg 。使用它解压压缩包 使用Audacity打开 转换成摩斯密码,…

C语言程序设计 复习总结[持续更新ing]

目录 一 初识C语言 1 main 主函数 2 注释 3 C 程序执行的过程: 4 C 程序的结构 5 进制的转换 1.内存容量 2.二进制与十进制的转换 1>将二进制数转换成十进制 2>将十进制转换成二进制数 3.二进制与八进制的转换 1>将八进制数转换成二进制: 2>将二进…

Java项目:JSP酒店客房管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 酒店管理系统共分为三个角色,客房经理、前台管理员、客户,各个角色的权限各不相同; 客房经理功能包括&#…

leetcode《图解数据结构》刷题日志【第五周】(2022/11/21-2022/11/28)

leetcode《图解数据结构》刷题日志【第五周】1. 剑指 Offer 60. n 个骰子的点数1.1 题目1.2 解题思路1.3 数据类型功能函数总结1.4 java代码1.5 踩坑小记1.6 进阶做法2. 剑指 Offer 63. 股票的最大利润2.1 题目2.2 解题思路2.3 数据类型功能函数总结2.4 java代码3. 剑指 Offer …

SpringBoot SpringBoot 原理篇 1 自动配置 1.16 自动配置原理【2】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.16 自动配置原理【2】1.16.1 看源码了1.16.2 Import({AutoConfig…

archlinux 安装matlab

最近在学matlab使用的是windows版本的,比起windows我更喜欢在linux中写代码。于是乎就想在Linux中安装一下。 主要过程参考此篇文章: 《【首发】 ubuntu20.04安装matlab2021b/matlab2020b》 https://blog.csdn.net/hanjuefu5827/article/details/1151677…

【Hack The Box】Linux练习-- Forge

HTB 学习笔记 【Hack The Box】Linux练习-- Forge 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f36…

队列(C语言实现)

文章目录:1.队列的概念2.队列的结构3.接口实现3.1初始化队列3.2判断队列是否为空3.3入队3.4出队3.5查看队头元素3.6查看队尾元素3.7统计队列数据个数3.8销毁队列1.队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特…

jQuery插件【validate】国际化校验插件

jQuery插件系列 相信大家在网站上都遇到过这种注册的情况吧,有的时候我们什么也不输入点登录或者注册或者鼠标失去焦点的时候,就会自动提示xxx为空,密码不正确,请输入xxx等一系列的提示信息。 那么这是怎么实现的呢,其…

【LeetCode】No.101. Symmetric Tree -- Java Version

题目链接:https://leetcode.com/problems/symmetric-tree/ 1. 题目介绍(Symmetric Tree) Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). 【Translate】: 给定…

QT实战项目1——无边框窗口拖拽和阴影

课时2 开发环境,无边框窗口拖拽和阴影_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14t411b7EL?p2&vd_source0471cde1c644648fafd07b54e303c905 目录 一、设置无边框 和 鼠标可以拖动窗口 1.1 设置无边框 1.2 鼠标拖动 1.3 展示阴影 一、设置无边框 和 鼠标可…