c++的多态,继承,抽象类,虚函数表,虚函数等题目+分析

目录

题目 

代码题

分析

主观题


题目 

代码题

class A
{
public:virtual void func(int val = 1) {std::cout << "A->" << val << std::endl;}virtual void test() { func(); }
};class B : public A
{
public:void func(int val = 0) { std::cout << "B->" << val << std::endl;}
};int main(int argc, char* argv[])
{B* p = new B;p->test();return 0;
}

A: A->0       B: B->1      C: A->1       D: B->0       E: 编译出错       F: 以上都不正确

分析

p调用了B中的test(),传入B的this指针

  • 但test()在B中没有,它是A中的函数,且没有被重写,所以需要去A中寻找
  • 而调用A中函数需要使用A类型的this指针,所以B类型的this指针被转换为A类型的
  • 而调用了test()后,里面又会调用func()
  • 别忘了,这里的this指针实际还是指向B的(只是指在了B中的A部分)
  • 所以,根据多态性,调用了B中的func,所以要打印B->
  • 注意这里的val
  • 多态实际上是使用了基类中函数的声明+子类中该函数的定义
  • 所以!!!val的值是A中的1(int val = 1)
  • 所以最后结果是B->1

 

主观题

1. 什么是多态?

多态 -- 完成同一个动作,根据指针/引用实际指向的对象类型,来调用函数

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

  • 重载 -- 在同一作用域下,两个函数的名字相同,但参数列表/返回值不同
  • 重定义/隐藏 -- 在继承关系中,父类和子类都有一个同名函数,无论参数如何,都会构成隐藏,优先调用子类的函数
  • 重写/覆盖 -- 在继承关系中,父类和子类都有一个相同的虚函数(同名,同参数,同返回值),就说子类的该函数重写了父类的该函数 ; 当使用父类的指针/引用调用该函数时,会实际调用子类中的

3. 多态的实现原理?

虚函数+虚函数表+运行时多态性

  • 虚函数 -- 可以在派生类中被重写
  • 虚表 -- 存储类中虚函数的指针
  • 运行时多态性 -- 实现运行时可以根据实际对象调用对应函数

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

可以

  • 但内联函数原本是不生成地址的,直接在调用处展开代码
  • 而虚函数需要将地址存入虚表
  • 所以一旦成为虚函数,就会失去内联的特性

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

不可以

  • 静态成员属于整个类,调用时直接使用类域即可
  • 虚函数调用需要传入this指针(需要this指针来找到该对象的虚表,在里面寻找虚函数),而静态成员没有this指针

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

不可以

  • 因为构造函数是用来初始化对象的,包括设置对象的虚表指针,而虚函数的调用依赖于虚表指针
  • 所以虚表和虚函数的机制依赖于已经正确初始化的对象 -- 构造函数->虚表指针->虚函数
  • 如果构造函数是虚函数,那么调用的时候需要依赖虚表找到虚函数,但虚表又是在构造函数之后才能创建好
  • 那么这个先后顺序就很迷惑了,所以不可以是虚函数

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

当然可以

  • 编译器会对析构函数的函数名做处理,从而达到虚函数的条件
  • 场景 -- 当需要使用基类类型的指针/引用指向派生类,而没有其他方法析构该派生类时(防止内存泄漏)

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

普通函数更快

  • 因为虚函数需要在运行时,根据类型 -> 去对象中找虚表 ->在虚表中找虚函数
  • 而普通函数直接jmp到函数地址即可

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

  • 编译阶段生成
  • 存在常量区

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

一个派生类对象中,会存储两份共同基类,造成数据冗余+二义性问题

虚继承 :

  • 将基类声明成虚基类,该类在派生类中只存在一份
  • 会在包含它的派生类中,存放一份虚基表,使可以通过该表中存放的偏移量来访问基类

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

  • 抽象类 -- 包含纯虚函数的类(纯虚函数 -- 在基类中的虚函数后加上=0)
  • 作用 -- 定义一个通用的接口,然后由具体的派生类来实现这个接口以提供不同的行为

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

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

相关文章

如何在服务器上部署一个java程序

如何在服务器上部署一个java程序&#xff1f; 一、在服务器上安装jdk环境 1.创建目录用于存放jdk文件 cd /usr/local 2.下载最新版oracle jdk22 wget https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.tar.gz 3.解压 tar -zxf jdk-22_linux-x64_bin.ta…

进化版ChatGPT的Siri今年无缘上线!苹果正打造史上最薄iPhone 17

目录 01 超强Siri助手预计2025年上线 02 集成ChatGPT但没有买单 03 iPhone 17更轻薄 最新报道称&#xff0c;苹果的AI功能将在未来几个月逐步推出&#xff0c;并持续到2025年。 据称&#xff0c;今年夏天结束前&#xff0c;开发者们仍无法试用和体验。 因此&#xff0c;在即…

MySQL系列-语法说明以及基本操作(一)

1、前言 主要讲解MySQL的基本语法 官网文档 https://docs.oracle.com/en-us/iaas/mysql-database/doc/getting-started.html 关于MySQL的基本语法&#xff0c;关于数据类型、表的操作、数据操作、事务、备份等&#xff0c;可参考 http://www.voidme.com/mysql 2、数据类型 数…

Oracle中递归查询(START WITH……CONNECT BY……)

一、基本语法 在Oracle中START WITH……CONNECT BY……一般用来查找存在父子关系的数据&#xff0c;也就是树形结构的数据。 SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;start with [condition]&#xff1a;设置起点&#xff0c;用来限制第一层的数…

计算机网络知识点(六)

目录 一、简述TCP的keep-alive以及和HTTP的keep-alive的区别 1、HTTP keep-alive 2、TCP keep-alive 二、简述TCP协议的延迟ACK和累计应答 1、延迟应答 2、累计应答 三、简述TCP如何加速大文件的传输 1、建连优化 2、平滑发包 3、丢包预判 4、RTO 探测 5、带宽评估…

线程间通信

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 我们已经知道进程之间不能直接共享信息&#xff0c;那么线程之间可以共享信息吗&#xff1f;我们通过一个例子来验证一下。定义一个全局变量g_num&am…

【腾讯云智笔试题——分苹果两种解法】

文章目录 题目描述解题思路&#xff1a;疑惑解析代码中明明是两个嵌套的for循环时间复杂度为什么是O&#xff08;m&#xff09;&#xff1f; 题目描述 有m个苹果&#xff0c;n个小孩。每个小孩都有一个编号&#xff0c;小明的编号是。要尽量公平的分苹果&#xff0c;相邻编号的…

C++ 类与对象的使用要点(超详细解析,小白必看系列)

1.面向过程和面向对象初步认识 C语言是面向过程的语言&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 例如&#xff1a;洗衣服 C是基于对象的&#xff0c;关注的是对象&#xff0c;将一件事拆分成不同的对象&#xff0c;靠对…

短信接口的对接及应用

短信接口即企业短信平台接口&#xff08;API版&#xff09;&#xff0c;是面向有一定技术开发能力的企业用户而单独研发的短信(sms)接口。以下是关于短信接口的主要内容和特点&#xff1a; 功能及作用&#xff1a; 支持二次开发&#xff1a;可以在现有的软件上进行定制修改、功…

Pandas——词云图绘制

文本处理 词频统计 绘制词云图 英文词频统计 分词→词形还原(nltk) →去停用词 →统计词频 中文词频统计 分词(jieba) →去停用词 → 统计词频 评论文本的分析 通过词云图展示出现次数较多的词, 可以发现问题 微博/头条/新闻评论 词云图绘制 可以使用Pyecharts绘制词云…

[NewStarCTF 2023 公开赛道]R!C!E!

好久没写了。今天儿弄一个rce 题很直接&#xff0c;好久没这么直白的题了&#xff0c;看源码 <?php highlight_file(__FILE__); if(isset($_POST[password])&&isset($_POST[e_v.a.l])){$passwordmd5($_POST[password]);$code$_POST[e_v.a.l];if(substr($password…

amov无人机连接;+数据传输;啊啊啊啊啊

socket传输数据: 局域网连接 连接---通信(命令行直接;)--- 传输数据(socket)--传输内容:launch文件; qgc连接; 1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部&qu…

电脑提示d3dcompiler_47.dll丢失的解决方法,实测靠谱的5种方法

在计算机使用过程中&#xff0c;缺失d3dcompiler_47.dll这一系统文件是一个常见问题&#xff0c;尤其是对于游戏和图形密集型应用程序用户来说尤为重要。这个文件是DirectX软件工具包的一部分&#xff0c;主要用于处理图形渲染的应用程序接口的核心元素。当你在运行游戏或某些软…

如何定制Spring的错误json信息

一&#xff0c;前言 相信很多同学都有遇到过这样的spring错误信息。 在我们没有做catch处理时或者做全局的exceptionHandle时&#xff0c;Spring遇到抛出向外的异常时&#xff0c;就会给我们封装返回这么个格式的异常信息。 那么问题来了&#xff0c;我们能否对这个返回增加错…

网络安全从入门到精通(特别篇I):应急响应案例

蓝队应急响应实战 1. 应急响应1. 应急响应 获取当前WEB环境的组成架构(语言,数据库,中间件,系统等) 分析思路: 1、利用时间节点筛选日志行为 2、利用已知对漏洞进行特征筛选 3、利用后门查杀进行筛选日志行为 #内容点: 应急响应: 1、抗拒绝服务攻击防范应对指南 2、勒…

day13 二叉树的遍历

一、二叉树的递归遍历 题目链接&#xff1a; 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历 文章讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E…

Go源码--sync库(3):sync.Pool(2)

回收 回收其实就是将 pool.local 置为空 可以让垃圾回收器回收 我们来看下 源码 func init() {// 将 poolCleanup 注册到 gc开始前的准备工作处理器中在 STW时执行runtime_registerPoolCleanup(poolCleanup) }这里注册了清理程序到GC前准备工作 也就是发生GC前需要执行这段代…

云上Elasticsearch-规格选型

阿里云ES购买实例规格&#xff0c;数据节点&#xff0c;kibana节点&#xff0c;专有主节点&#xff0c;冷数据节点&#xff0c;协调节点&#xff0c;弹性数据节点各是什么 在阿里云Elasticsearch中&#xff0c;不同类型的实例规格代表着不同的角色和功能。以下是对各个节点类型…

任务流程----

创建macvlan网络 sudo docker network create \--driver macvlan \--subnet<你的宿主机子网&#xff0c;如192.168.1.0/24> \--gateway<你的宿主机网关> \-o parent物理接口名称&#xff0c;如eth0 \my-macvlan-1 创建容器 sudo docker run -itd \--name contai…

鸿蒙HarmonyOS实战:渲染控制、路由案例

条件渲染 简单来说&#xff0c;就是动态控制组件的显示与隐藏&#xff0c;类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中&#xff0c;数据一般是后端返回来的对象格式&#xff0c;对此我们需要进行遍历&#…