【C++从0到王者】第二十六站:一些经典的多态面试题

news2024/10/5 16:32:57

文章目录

  • 前言
  • 一、多态的常见选择
  • 二、多态的常见问答
  • 总结

前言

多态是C++的一大疑难杂症,有很多细枝末节的东西非常繁琐,这里搜集了一些常见的选择与问答。可以为大家带来帮助理解多态


一、多态的常见选择

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

解析:答案是继承,继承可以使得该类不需要写某些成员就可以去使用他们。从现实世界的角度理解,也是继承家业可以变得更加富有

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

解析:方法就是函数,言外之意就是函数的定义与具体的对象没有太大的关系。对函数的调用是与具体的对象的有较大的关系。那么这不就是多态吗。而多态可以分为静态多态与动态多态,或者称为静态绑定与动态绑定。静态绑定有模板,运算符重载。动态绑定就是我们常见的虚函数重写实现的多态。这里显然是动态绑定

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

解析:这道题显然选则C,应该是优先使用组合。

  1. 以下关于纯虚函数的说法,正确的是( )
    A:声明纯虚函数的类不能实例化对象 B:声明纯虚函数的类是虚基类
    C:子类必须实现基类的纯虚函数 D:纯虚函数必须是空函数

解析:这道题显然选择A,声明纯虚函数的类肯定不能实例化出对象

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

解析:这道题选择的是B。对于A而言,其实描述不太准确,它应该问的是虚函数的重写,而重写必须满足虚函数+三同。对于B,虚函数确实不能是内联函数。C虚函数可以不用重写。D、虚函数不可以加上static修饰。

  1. 关于虚表说法正确的是( )

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

解析:这道题选择的是D,对于A而言,多继承存在两张以上的虚表。对于B,不是共用一张的。对于C,虚表是在编译阶段生成的。

  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,A类和B类的前四个字节存储的都是虚表地址,且虚表中的虚函数相同,但A类和B类使用的不是同一张虚表

二、多态的常见问答

  1. 什么是多态?

多态分为两种,一种是静态的多态,一种是动态的多态。静态的多态如函数模板,运算符重载,运算符重载就是编译器通过函数名修饰规则等方式实现的。动态的多态需要继承中虚函数的重写,父类的指针或引用去调用该虚函数,这两个条件才能达成。

无论是静态的多态还是动态的多态,都是更方便和灵活多种形态的调用。

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

image-20230902163857146

  1. 多态的实现原理?

静态的多态是通过函数名修饰规则来实现的,而动态的多态是通过虚函数表来实现的。

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

答:可以,不过编译器就忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去。内联函数本身并没有地址。虽然语法上可以通过,但是其本质并非将虚函数变成了内联。因为我们的这个inline的作用仅仅只是建议成为内联,具体是否为内联取决于编译器。而且我们不写inline,编译器也会自行判断是否需要为inline。

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

答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,因为就没有对象,没有对象哪来的虚表,所以静态成员函数无法放进虚函数表。无法实现出多态,也就没有意义,所以语法会强制检查。

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

答:不能,编译直接报错。因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。如果将构造函数变为了虚函数,那么就变成了先有鸡还是先有蛋的问题。因为只有对象初始化好了,才会有虚表。而此时我们将构造函数变成了虚函数,想要将他放入虚表。这就出现了先有鸡还是先有蛋的问题了。

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

答:可以,并且最好把基类的析构函数定义成虚函数。否则可能出现内存泄漏的问题

  1. 对象访问普通函数快还是虚函数更快?

答:首先如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。

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

答:虚函数表是在编译阶段就生成的,一般情况下存在代码段(常量区)的。

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

答:数据冗余和二义性。原理是虚基表,存储偏移量。

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

答:抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系


总结

本文讲解了一些关于多态的常见面试题,希望能对读者带来帮助。

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

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

相关文章

C语言面试题值反转字符串

知识捡漏本 1.C语言优先级 :左高于高于 右 2.定义宏函数product,调用product后,里面的i和i都是加两次1,i就是两个加2后的i相乘,i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法,最终i和最后一…

《机器人学一(Robotics(1))》_台大林沛群 第 4 周【机械臂 逆运动学】 Quiz 4

待完善: 第6-8 谁做出来了,麻烦指下路,谢谢! 第6-7: 连蒙带猜🤣第8: 猜不出来😂 coursera链接 文章目录 第1题第2题第3题第4题第5题-8求解 θ3-θ1的 Python 代码 第8题求解 θ4 …

酷克数据与华为合作更进一步 携手推出云数仓联合解决方案

在一起,共迎新机遇!8月25-26日,2023华为数据存储用户精英论坛在西宁召开。酷克数据作为国内云原生数据仓库的代表企业,也是华为重要的生态合作伙伴,受邀参与本次论坛,并展示了云数仓领域最新前沿技术以及联…

从半年报里,看中国制造高质量发展的“美的样本”

文 | 螳螂观察 作者 | 图霖 制造业生产和市场需求稳步回升的大背景下,国内制造企业来到新的竞逐拐点,高质量发展的样本企业将获得更大的突围机遇。 作为中国制造代表性企业的美的集团,一直是稳健经营的代表企业。但因受到大环境冲击&#…

JavaScript设计模式(三)——单例模式、装饰器模式、适配器模式

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

手写RPC框架--2.介绍Zookeeper

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧)https://gitee.com/captaindeng/dcyrpc-framework 该项目的RPC通信将采用NettyZookeeper,所以会在前两章介绍使用方法 介绍Zookeeper Zookeepera.概述1) 数据模型2) Watcher机制 b.安装和基本操作1) Java操作zookeep…

记一次postgres导致cpu100%

周末想打两把训练赛,没想到朋友发来一个截图 我:嗯??wtf 于是我上服务器看了一下日志,诶我超,还真的 查看进程详情 [rootiZ7xv7q4im4c48qen2do2bZ project]# pstree -tp postgres memory(904475)─┬─…

分布式锁实现二. memcached分布式锁

文章目录 memcached分布式锁实现原理:优缺点 开发准备安装memcached服务端安装jar到maven本地仓库 代码开发初始化Memcached客户端锁相关操作核心代码本地运行效果docker运行效果 memcached分布式锁 实现原理: memcached带有add函数,利用ad…

【半监督医学图像分割】2022-MedIA-UWI

【半监督医学图像分割】2022-MedIA-UWI 论文题目:Semi-supervise d me dical image segmentation via a triple d-uncertainty guided mean teacher model with contrastive learning 中文题目:基于对比学习的三维不确定性指导平均教师模型的半监督图像分…

Linux编程--进程--fork使用,创建父子进程

1.使用fork函数创建一个进程 #include <unistd.h>pid_t fork(void); 返回值为0&#xff0c;代表当前进程是子进程 返回值为非负数&#xff0c;代表当前进程为父进程 调用失败&#xff0c;返回-1 代码&#xff1a; #include <stdio.h> #include <sys/types.h&g…

锁( ReentrantLock,Synchronized)

1.lock和synchronized 语法层面 synchronized 是关键字&#xff0c;源码在 jvm 中&#xff0c;用 c 语言实现&#xff1b; Lock 是接口&#xff0c;源码由 jdk 提供&#xff0c;用 java 语言实现&#xff1b; 使用 synchronized 时&#xff0c;退出同步代码块锁会自动释放&…

idea中设置指定图片为项目站标

前提是准备好一张图片 在idea中创建imgs文件夹&#xff0c;放入图片 创建一个HTML文件 建立链接link标签&#xff0c;链接照片即可 <link href"../02css/imgs/2.jpg" rel"shortcut icon" type"image/x-icon"> 执行效果如下图所示&…

音频——I2S 左对齐模式(三)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 I2S left波形图逻辑分析仪抓包 I2S left I2S 左对齐标准 标准左对齐格式的数据的 MSB 没有相对于 BCLK 延迟一个时钟。左对齐格式的左右声道数据的 MSB 在 LRCLK 边沿变化后…

斐波那契数【动态规划】

斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n >…

Golang:微服务常用代码分层结构

1.代码结构 代码分层结构是一个老生常谈的话题&#xff0c;好的代码结构能够使得系统易于理解、开发及维护&#xff0c;如果代码结构很混乱就会使得不同层级的代码块耦合&#xff0c;导致难以维护和拓展。 比较经典的代码结构&#xff08;宏观&#xff09;有Web的MVC模式分层结…

SpringBoot整合websockt实现消息对话

文章目录 前言websockt什么是websockt&#xff1f;websockt和Socket区别代码部分实战应用 前言 websockt 什么是websockt&#xff1f; WebSocket是一种在Web应用程序中实现实时双向通信的技术。Web应用程序通常是基于HTTP协议的&#xff0c;HTTP是一种请求/响应式的协议&…

【服务器使用基础】---华为云云耀云服务器实例使用实践

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求…

肖sir__linux详解__003(vim命令)

linux 文本编辑命令 作用&#xff1a;用于编辑一个文件 用法&#xff1a;vim 文件名称 或者vi &#xff08;1&#xff09;编辑一个存在的文档 例子&#xff1a;编辑一个file1文件 vim aa &#xff08;2&#xff09;编辑一个文件不存在&#xff0c;会先创建文件&#xff0c;再…

Python-图像拼接神器-stitching

多幅图像的拼接 采用这个包&#xff0c;图像拼接结果很好~ 代码只需要三四行 import stitching import cv2imgs ["data/test02/1Hill.jpg","data/test02/2Hill.jpg","data/test02/3Hill.jpg",] stitcher stitching.Stitcher() panorma stit…