【C++】继承和多态高频面试题整理

news2024/12/24 9:15:23

文章目录

  • 1. 选择题
  • 2. 问答题
    • 2.1 什么是多态?
    • 2.2 什么是重载、重写(覆盖)、重定义(隐藏)?
    • 2.3 多态的实现原理?
    • 2.4 inline函数可以是虚函数吗?
    • 2.5 静态成员可以是虚函数吗?
    • 2.6 构造函数可以是虚函数吗?
    • 2.7 析构函数可以是虚函数吗?什么场景下析构函数要搞成虚函数?
    • 2.8 对象调普通函数快还是虚函数更快?
    • 2.9 虚函数表是在什么阶段生成的,存在哪的?
    • 2.10 C++菱形继承的问题?虚继承的原理?
    • 2.11 什么是抽象类?抽象类的作用?

之前的几篇文章我们学习了C++中的多态和继承,这篇文章给大家整理一下继承和多态相关的常考题目,供大家学习。
当然里面有些问题都是之前文章里面详细讲解过的,文章链接放在这里,大家可以参考:
继承
复杂的菱形继承 及 菱形虚拟继承的底层原理
多态
详解多态的底层原理

1. 选择题

  1. 下面哪种面向对象的方法可以让你变得富有( )
    A: 继承 B: 封装 C: 多态 D: 抽象

答案:A

  1. ( )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关,而对方法的调用则可以关联于具体的对象。
    A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定

答案:D

  1. 面向对象设计中的继承和组合,下面说法错误的是?()
    A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用
    B:组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动态复用,也称为黑盒复用
    C:优先使用继承,而不是组合,是面向对象设计的第二原则
    D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现

答案:C(之前的文章里也有相关的讲解)
在这里插入图片描述
在这里插入图片描述
4. 以下关于纯虚函数的说法,正确的是( )
A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类
C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数

答案:A

  1. 关于虚函数的描述正确的是( )
    A:派生类的虚函数与基类的虚函数具有不同的参数个数和类型
    B:内联函数不能是虚函数(可以认为语法上可以)
    C:派生类必须重新定义基类的虚函数
    D:虚函数可以是一个static型的函数

答案:B(下面问答题有讲)

内联函数语法上可以是虚函数,但是编译器就忽略inline这个属性,这个函数本质就不再是inline,因为虚函数要产生地址放到虚表中去。

  1. 关于虚表说法正确的是( )
    A:一个类只能有一张虚表
    B:基类中有虚函数,如果子类中没有重写基类的虚函数,此时子类与基类共用同一张虚表
    C:虚表是在运行期间动态生成的
    D:一个类的不同对象共享该类的虚表

答案:D

  1. 假设A类中有虚函数,B继承自A,B重写A中的虚函数,也没有定义任何虚函数,则( )
    A:A类对象的前4个字节存储虚表地址,B类对象前4个字节不是虚表地址
    B:A类对象和B类对象前4个字节存储的都是虚基表的地址
    C:A类对象和B类对象前4个字节存储的虚表地址相同
    D:A类和B类虚表中虚函数个数相同,但A类和B类使用的不是同一张虚表

答案:D

2. 问答题

2.1 什么是多态?

那这个问题其实在前面的文章里都有详细的讲解,这里就不展开说了,大家参考之前的文章。

2.2 什么是重载、重写(覆盖)、重定义(隐藏)?

参考之前的文章。

2.3 多态的实现原理?

参考之前的文章。

2.4 inline函数可以是虚函数吗?

这个问题之前没讲,我们来说一说。

内联函数可以是虚函数吗?大家想一想

我们先来回顾一下,什么是内联函数?
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,用函数体替换函数的调用,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
那这样的话,如果一个内联函数真的被处理成内联函数的话,它是没有地址的,那没有地址的函数能是虚函数吗?
肯定是不行的,因为虚函数必须有地址,而且地址要放进虚函数表里面。
那这样来看,内联函数好像不能是虚函数。

但是:

内联函数一定会被当成内联处理吗?
是不是不一定啊。
因为内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。

那我们可以实验一下:

在这里插入图片描述
在这里插入图片描述
是不是可以啊。

所以:

语法上可以,但是编译器就忽略inline这个属性,这个函数本质就不再是inline,因为虚函数要产生地址放到虚表中去。

2.5 静态成员可以是虚函数吗?

我们可以先试一下:

在这里插入图片描述
这里编译器就直接报错,说static和virtual不能一起使用

所以:

静态成员不能是虚函数,因为因为静态成员函数没有this指针,使用类型::成员函数就可以调用,但这种调用方式无法访问虚函数表,因为访问虚函数表都是多态的情况下通过对象调用虚函数的方式访问的,静态成员函数的地址不会放进虚函数表。
static和virtual不能一起使用。

2.6 构造函数可以是虚函数吗?

答:

不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。
在这里插入图片描述

2.7 析构函数可以是虚函数吗?什么场景下析构函数要搞成虚函数?

答:

析构函数是可以搞成虚函数的,并且有些场景下是不是还需要搞成虚函数重写啊,这个是我们讲的虚函数重写的两个例外之一,大家忘了可以回看之前的文章。

2.8 对象调普通函数快还是虚函数更快?

哪个快呢?

我们可能会觉得调普通函数快,因为调普通函数不需要像调虚函数那样还得通过虚指针去虚函数表里面找。

但是呢,这样说不准确,我问大家,调用虚函数一定要去虚表里面找吗?

在这里插入图片描述
在当前这个情况下,其实它们一样快
在这里插入图片描述
因为你要比较这个速度的话,要去看情况:
首先如果是普通对象去调用,是一样快的。(普通对象调用不可能构成多态,和普通函数一样去调用)
如果是指针或引用去调用,则调用的普通函数比虚函数快,因为构成多态(即使不满足其它多态的条件,只要是指针或引用调用,他这里统一处理),运行时调用虚函数需要到虚函数表中去查找。
在这里插入图片描述

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

这个在上一篇文章也详细介绍过了。

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

2.11 什么是抽象类?抽象类的作用?

后面这几个问题前面的文章也都讲了,这里就不提了。

在这里插入图片描述

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

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

相关文章

华为云零代码平台AstroZero新手操作指南-3分钟体验创建培训报名表

华为云Astro轻应用Astro Zero是华为云为行业客户、合作伙伴、开发者量身打造的低代码/零代码应用开发平台,提供全场景可视化开发能力和端到端部署能力,可快速搭建行业和大型企业级应用并沉淀复用行业资产,加速行业数字化。 在AstroZero上&am…

el-tabel导出excel表格

1、安装插件 npm install file-saver --save npm install xlsx --save 2、引入插件 import FileSaver from "file-saver"; import * as XLSX from xlsx; 3、在tabel中添加ref属性和导出方法 4、添加方法 exportExcel (excelName) {try {const $e this.$refs[repo…

DFS之剪枝与优化--小猫爬山

思路&#xff1a;对小猫的数量和车箱数进行bfs&#xff0c;一旦小猫的数量达到n&#xff0c;就统计ans的数量&#xff0c;如果当前车的剩余重量无法再承受任意一个猫的重量&#xff0c;那么我们将车辆数1来保证小猫能够下山。 #include<bits/stdc.h> using namespace std…

ChatGPT使用技巧和实践

在工作使用当中&#xff0c;需要使用到GPT&#xff0c;目前使用的是浏览器端的WeTab。 下面是给AI的提问和交互 请写出HashMap和Hashtable的区别 HashMap和Hashtable是Java中两种常用的哈希表实现&#xff0c;它们在功能和使用上有一些区别。线程安全性&#xff1a;HashMap是…

如何利用在线培训考试系统提升员工技能?

在如今竞争激烈的商业环境中&#xff0c;不断提升员工的技能和知识变得至关重要。为了满足这一需求&#xff0c;越来越多的企业开始采用在线培训考试系统。借助这种系统&#xff0c;企业可以以有效和高效的方式提供培训&#xff0c;并确保员工能够学到最新的知识和技能。 1. 灵…

3.2 队列

定义: 队列是一种插入元素只能在一端进行, 删除元素只能在另一端进行的线性表. 所谓队列是线性表, 是指队列的逻辑结构属于线性表, 只不过在操作上加了一些约束. 队列可以插入元素的一端叫做队尾(Rear), 可以删除元素的一端叫做队头(Front). 队列是一种先进先出的结构. First I…

vue创建脚手架项目启动

vue创建脚手架项目&启动 1、创建项目2、运行项目 1、创建项目 vue create vuecli-demo说明这里使用vue2项目 2、运行项目 cd vuecli-demo yarn serve访问 http://localhost:8080/

springboot()—— 集成redis

1、新建一个springboot项目 2、添加redis依赖包 可以在新建项目的时候就选上 也可以建完项目以后手动导入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </d…

[uni-app] 微信小程序 - 组件找不到/导入报错 (分包问题导致)

文章目录 问题表现问题原因 问题表现 切换了个路径下的组件, 导入失败, 尝试了清缓存\重启\删项目等一些列操作均无效 上面两个路径中, 都存在一模一样的videItem.vue Main路径是可以导入的 Main路径是无法导入的 问题原因 后来发现, 是 分包的问题导致. 我们先来假设一个场…

如何通过日志分析性能

根据监控指标&#xff0c;只要有一项指标不超了&#xff0c;就不满足性能&#xff0c;根据这个指标&#xff0c;分析数据流向&#xff0c;看下到底什么原因导致这个指标超了&#xff0c;是本身原因还是其它原因&#xff0c;分析客户端、网络、硬件、中间件、数据库、应用程序等…

一个简单的 Android 版本目录(Version catalog)实现指南

一个简单的 Android 版本目录实现指南 使用 TOML 格式 在本文中&#xff0c;我们将探讨版本目录以及如何实现它。 版本目录 Gradle 版本目录使您能够以可扩展的方式添加和维护依赖项和插件。因此&#xff0c;不必在各个构建文件中硬编码依赖项名称和版本&#xff0c;而是在目…

Windows 10 关于进程出现 已挂起,导致无法结束任务,或者taskkill 命令也被拒绝访问等问题解决方法

理解 也就是说&#xff0c;平时电脑启动的是快速启动配置&#xff0c;相当于是休眠&#xff0c;但是有可能会存在一些 bug &#xff0c;所以&#xff0c;作为开发者来说&#xff0c;最好是取消这个快速启动的配置&#xff0c;不然 bug 满天飞&#xff0c;当然这只是有可能。 …

MYSQL练习三答案

练习3 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案 1、写一条SQL查询语句&#xff0c;找出所有属于"Electronics"类 别的产品信息。 SQL语句 select * from products where category Electronics;结果&#xff1a; 2…

安防视频管理平台GB设备接入EasyCVR, 如何获取RTMP与RTSP视频流

安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比…

微信小程序中使用echarts方法

小程序中使用echarts echarts是一个基于JS的数据可视化图标库&#xff0c;它提供了直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性定制的数据可视化图表。一般在vue中会使用到&#xff0c;并且官网也详细的说明了如何在vue中使用&#xff0c;但是今天我想来探讨的…

python面试宝典1

目录标题 python基础1、代码中修改不可变数据会出现什么问题&#xff1f;什么异常&#xff1f;2、a1,b2,不用中间变量交换 a 和 b 的值&#xff1f;3、print调用python中底层的什么方法&#xff1f;4、理解下面代码&#xff0c;结果输出5、对input()函数的理解6、理解代码&…

誉天程序员-常用网站

学习方法六大招 日常你是如何学习新知识的&#xff1f;&#xff08;面试官爱问哦&#xff09; 1、百度百科概念了解 2、技术官网简单了解 3、同类产品技术选型 4、百度搜索入门案例 5、泛读百文瘦弱圆润 6、遇到问题问AI助手&#xff08;chatGPT&#xff09;噢 技术路线图&a…

C#中未能找到为main方法指定的XXX.Program怎么解决

有时在修改项目名称后&#xff0c;报错未能找到为main方法指定的XXX.Program 解决办法&#xff1a; 点击进入项目属性&#xff0c;将启动对象设置为空或者你要指定的XXX.Program&#xff08;改名后的&#xff09;

基于SDRAM的串口回环测试

文章目录 前言一、SDRAM简介二、SDRAM芯片手册解析2.1 芯片信息2.2 功能描述2.3 指令集 三、SDRAM配置3.1 初始化3.2 自动刷新3.3 突发写操作3.4 突发读操作3.5 仲裁3.5 FIFO控制3.5 FIFO数据读 四、结果验证 前言 本文将介绍在AWC_C4MB开发板上进行基于串口的SDRAM数据回环测试…

能直接运营的校园跑腿代买拿寄取小程序开发

​说到做跑腿生意&#xff0c;除了做同城跑腿配送外&#xff0c;校园跑腿可是即成本又低又好操作的一个项目。 一般省会城市大学大专基本都是有好几所的&#xff0c;学校的特点是人员密集&#xff0c;跑腿配送周期短&#xff0c;且配送人员好招募&#xff0c;推广人员好招募。…