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

【C++】多态问答题

前言

本篇仅整理一些比较偏的多态的问答题

在这里插入图片描述

文章目录

  • 前言
  • 一. 内联与虚函数
  • 二. 静态函数与虚函数
  • 三. 构造函数与虚函数
  • 四. 虚函数与普通函数
  • 结束语

一. 内联与虚函数

内联函数可以是虚函数吗?
首先我们看一下语法有没有问题
在这里插入图片描述

我们看到,程序成功运行了,语法也没有报错。好像没问题
但是,内联函数时不能成为虚函数的!

首先,内联关键字inline是对编译器的一种建议,具体该函数能否成为内联函数,还要看编译器。
而一个函数成为内联函数,那他就会像宏一样,直接在调用的地方展开,所以不需要函数地址
而虚函数是需要函数有地址的,因为需要将指向该函数的函数指针放到虚表里。
所以内联函数和虚函数是相矛盾的,二者不可兼得
这里之所以没有崩溃,是编译器认为该函数时虚函数了,就不会让他成为内联函数
在这里插入图片描述

PS:内联函数不可以是虚函数,但是inline修饰的函数可以是虚函数。这里要注意以下问法

二. 静态函数与虚函数

静态成员函数可以是虚函数吗?
答案是不可以

  1. 首先以使用的角度,静态成员变量或者静态成员函数并不是单独属于某个对象,和实现多态的目的没有关系,多态就是要让不同对象有不同的结果。
  2. 其次,静态成员函数没有this指针,使用类型::成员函数的调用方式,无法访问虚函数表,所以静态成员函数无法放到虚表里

三. 构造函数与虚函数

构造函数可以是虚函数吗?
答案是不可以
因为虚函数的地址是要进虚表的,虚表是在编译时形成的,没问题,但是虚表指针是在初始化列表形成的。
如果将构造函数设置成虚函数,那调用构造函数要虚表指针,但是虚表指针要在构造函数的初始化列表生成,就找不到虚表。成了一个死循环。

扩展:拷贝构造也不可以设置成虚函数,原理和构造函数一样。
在这里插入图片描述

但是赋值重载可以设置成虚函数,语法并没有报错
但是不建议,因为子类的赋值重载本身就需要调用父类的赋值重载,父类部分交给父类,子类部分交给子类,那你重写了赋值重载,那不就找不到父类的赋值重载了吗。

四. 虚函数与普通函数

虚函数和普通函数的效率谁更高
答案是不一定

虚函数其实并不是一定去虚表里找函数地址。
除内联函数,每个函数都有都有函数地址,而一个类有虚函数,则会有虚表,会有指向虚函数的函数指针存储在虚表中。
而如果是普通对象调用虚函数,其实是直接调用函数地址,并不会进入虚表
而当是指针或引用时,才会进入虚表找函数地址

结束语

本篇文章是对多态的一些比较偏的知识的笔记,掌握要求不深,感谢您的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

http://www.lryc.cn/news/56351.html

相关文章:

  • 【设计模式】适配器模式
  • 跨域之CorsFilter
  • STM32基于HAL工程读取DS1302时间数据
  • 《Effective Objective-C 2.0 》 阅读笔记 item10
  • gpt3官网中文版-人工智能软件chat gpt安装
  • 工作常用、面试必问:Hive 窗口函数汇总
  • spring5(五):AOP操作
  • functional.partial
  • C#缩放PDF文件
  • 【Java面试八股文宝典之MySQL篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day20
  • Nsight System的安装和使用
  • Spring销毁的几种实现
  • 【 Spring 核⼼与设计思想 】
  • Arrays.sort()——逆序
  • 测试2年遇到瓶颈,如何跨过这个坎,实现涨薪5k?
  • 骑行团队怎样才能健康运行?
  • 动力节点王鹤SpringBoot3学习笔记——第四章 访问数据库
  • segno.helpers.make_mecard(Python)
  • OBCP第八章 OB运维、监控与异常处理-日常运维操作
  • springboot-gateway注册nacos失败,控制台没有报错
  • CLIP:语言-图像表示之间的桥梁
  • failed: open /etc/resolv.conf: no such file or directory“ cause k8s init failed
  • 「科普」如何评价供应商的MES系统
  • 海康3D轮廓仪调试详细步骤
  • 【Linux】PCB(进程控制块)
  • 风电的Weibull分布及光电的Beta分布组合研究(Matlab代码实现)
  • 《Effective Objective-C 2.0 》 阅读笔记 item11
  • Python常见装饰器使用(实用向)
  • 集合详解之(三)单列集合接口Set及具体子类HashSet、TreeSet
  • 力扣刷题笔记22—— 矩阵中的路径(回溯)/pair的学习