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

日常知识点之随手问题整理(虚函数 虚函数表 继承的使用场景)

新来的同事提到一个虚函数解耦头文件的问题,就想起来对虚函数进行一些回顾。
他的问题是,通过纯虚函数,如何实现不包含头文件即可真正调用到子类的实际接口。
====》这里肯定是不合理的,需要一个中间管理类,对纯虚函数和相关子类进行管理,实现接口调用。(类似工厂模式,实现解耦吧)。
====》衍生考虑,通过基类调用到真实的子类行为接口,知识点整理。

记忆中遇到过继承相关的架构代码,记忆中一个点就是:通过容器存储基类的指针,实际指针进行调用时为子类的接口。

1:在使用的角度考虑:核心还是通过基类指针调用实际子类接口。

一般继承是为了实现多态,通过基类指针可以实现不同子类对象的存储,统一调度。
====》通过基类调用接口时,实际上调用的是真正的子类中行为接口。
在这里插入图片描述

2:原理:虚指针和虚函数表

虚指针:每个有虚函数/纯虚函数的类,或者继承自(有虚函数/纯虚函数的类)的类,构造对象时,都会隐藏构造一个指针。
虚函数表是静态的,在编译时就已经确定了,每个类静态绑定函数地址。

虚继承:维持的是一个虚基类表,和一个虚基类指针。

====》这里虚函数表vtable 是 类级别唯一的静态表,这个应该是通过编译器定义的一个全局符号找到的。 (nm XXX| c++filt | grep ‘vtable for’)
====》虚基类表(虚继承中)也是静态的,目的是为了菱形继承时继承同一个实例。 (这里共享相同的函数和成员? 只有一份,成员共享问题如何处理? 使用cl指令验证查看)

在这里插入图片描述

3:销毁:继承情况下,子类释放流程/基类析构virtual

在这里插入图片描述

使用vs(项目–>属性–>C/C++ —> 命令行—》其他选项中增加 /d1 reportSingleClassLayoutXXX XXX为类名)或者cl指令,可以编译时查看对应cpp文件中类的内存布局,对相关逻辑进行验证。

http://www.xdnf.cn/news/4453.html

相关文章:

  • 【Linux 系统调试】Linux 调试工具strip使用方法
  • Kubernetes生产级资源管理实战:从QoS策略到OOM防御体系
  • C 语言网络编程问题:E1696 无法打开 源 文件 “sys/socket.h“
  • ubuntu安装Go SDK
  • linux 怎么把trex-core-2.65用 crosstool-ng-1.27.0/编译
  • chili调试笔记13 工程图模块 mesh渲染 mesh共享边显示实现
  • FlyEnv:优雅直观的跨平台开发环境管理工具
  • VUE+ElementUI 使用el-input类型type=“number” 时,取消右边的上下箭头
  • Nginx 搭建支持多版本和前端路由的静态网站
  • 高斯牛顿法 梯度下降法 LM算法的区别
  • 【ARM AMBA AHB 入门 3 -- AHB 总线介绍】
  • Postman中https和http的区别是什么?
  • Linux 下MySql主从数据库的环境搭建
  • 什么是回调 钩子 Hook机制 钩子函数 异步编程
  • 【Prometheus】业务指标与基础指标的标签来源差异及设计解析
  • 4大主流行业CRM需求精解:精准匹配业务痛点与选型策略
  • 数据结构与算法-单链表的应用
  • C语言学习之字符函数和字符串函数
  • 【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!
  • Spark 之 YarnCoarseGrainedExecutorBackend
  • Linux基本操作——网络操作文件下载
  • 1、RocketMQ 核心架构拆解
  • $在R语言中的作用
  • mdadm 报错: buffer overflow detected
  • 数字电子技术基础(五十五)——D触发器
  • 5月13日观测云发布会:这一次,我们不只是发布产品
  • 项目改 pnpm 并使用 Monorepo 发布至 npm 上
  • ChatGPT-4o:临床医学科研与工作的创新引擎
  • SQL 子查询
  • 深入浅出理解常见的分布式ID解决方案