【C++学习笔记】深入理解虚函数和多态

news2025/7/18 20:50:18

在这里插入图片描述


文章目录

  • 1. 基本概念
    • 1.1 虚函数
    • 1.2 虚函数表
    • 1.3 虚函数表指针
    • 1.4 虚函数表在支持多态方面的工作原理
  • 2. 类对象在内存中的布局
  • 参考

1. 基本概念

1.1 虚函数

类的成员函数,并不占用类对象的内存空间。

类中有虚函数,编译器会向类中插入一个看不见的成员变量,类似下面的伪代码:

class A
{
	public:
		void *vptr; //虚函数表指针(virtual table pointer)
		//......
};

这个看不见的成员变量,就叫虚函数表指针


1.2 虚函数表

虚函数表的生成时机:
在编译过程中,当类A中虚函数个数≥1个,编译器就会为类A生成一个虚函数表(virtual table),这个虚函数表会一直伴随着类A,编译完成,在程序执行的时候,也会被加载到内存中。


1.3 虚函数表指针

在这里插入图片描述


在这里插入图片描述


1.4 虚函数表在支持多态方面的工作原理

在这里插入图片描述

多态必须存在虚函数,没有虚函数,绝不可能存在多态

从代码实现上:
在这里插入图片描述


class Base
{
	public:
	virtual void myvirfunc(){}
};

int main()
{
	Base*pa = new Base();
	pa->myvirfunc();//这是不是多态,是多态的

	Base base;
	base.myvirfunc();//这个就不是多态的

	Base* ybase = &base;
	ybase->myvirfunc();//这个也是多态
}

在这里插入图片描述


从表现形式上:

  1. 程序中既存在父类也存在子类,父类中必须含有虚函数,子类中也必须重写父类中的虚函数。
  2. 父类指针指向子类对象,或者父类引用绑定(指向)子类对象。
  3. 当通过父类的指针或引用,调用子类中重写的虚函数时,就能看出多态性的表现了。
class Derive:public Base
{
public:
virtual void myvirfunc(){}
}/父类指针指向子类对象
Derive derive;
Base*pbase =&derive;
pbase->myvirfunc();//Derive:myvirfunc()
/或者
Base*pbase2=new Derive();//释放内存请自行释放,在这里没演示
pbase2->myvirfunc();//Derive:myvirfunc()
//父类用绑定(指向)子类对象
Derive derive2;
Base&yinbase derive2;
yinbase.myvirfunc();//Derive:myvirfunc()

在这里插入图片描述


2. 类对象在内存中的布局

TBD.


参考

【1】C++ 多态
【2】C++ 一篇搞懂多态的实现原理
【3】C++ 多态 超详细讲解
【4】[C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
【5】CPU眼里的:多态
【6】C++语言面试中,如何深入理解虚函数和多态?
【7】侯捷谈虚函数与多态(上)
【8】侯捷谈虚函数与多态(下)

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

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

相关文章

Node.js CSRF 保护指南:示例及启用方法

解释 CSRF 跨站请求伪造 (CSRF/XSRF) 是一种利用用户权限劫持会话的攻击。这种攻击策略允许攻击者通过诱骗用户以攻击者的名义提交恶意请求,从而绕过我们的安全措施。 CSRF 攻击之所以可能发生,是因为两个原因。首先,CSRF 攻击利用了用户无法辨别看似合法的 HTML 元素是否…

【Linux】VSCode用法

描述 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 安装环境及运行C/C 1.1 安装及配置步骤 1.2 运…

来聊聊JVM中安全点的概念

文章目录 写在文章开头详解safepoint基本概念什么是安全点?为什么需要安全点JVM如何让线程跑到最近的安全点线程什么时候需要进入安全点JVM如何保证线程高效进入安全点如何设置安全点用一次GC解释基于安全点的STW实践-基于主线程休眠了解安全点的工作过程代码示例基于日志印证…

Nginx — http、server、location模块下配置相同策略优先级问题

一、配置优先级简述 在 Nginx 中,http、server、location 模块下配置相同策略时是存在优先级的,一般遵循 “范围越小,优先级越高” 的原则,下面为你详细介绍: 1. 配置继承关系 http 块:作为全局配置块&…

线性代数—向量与矩阵的范数(Norm)

参考链接: 范数(Norm)——定义、原理、分类、作用与应用 - 知乎 带你秒懂向量与矩阵的范数(Norm)_矩阵norm-CSDN博客 什么是范数(norm)?以及L1,L2范数的简单介绍_l1 norm-CSDN博客 范数(Norm…

【业务领域】电脑主板芯片电路结构

前言 由前几期视频合集(零基础自学计算机故障排除—7天了解计算机开机过程),讲解了POST的主板软启动过程;有不少网友留言、私信来问各种不开机的故障,但大多网友没能能过我们的这合集视频,很好的理清思路,那这样的情况…

pandas读取Excel数据(.xlsx和.xls)到treeview

对于.xls文件,xlrd可能更合适,但需要注意新版本的xlrd可能不支持xlsx,不过用户可能同时需要处理两种格式,所以可能需要结合openpyxl和xlrd?或者直接用pandas,因为它内部会处理这些依赖。 然后,…

JVM——垃圾收集策略

GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间&#xff0c…

马克·雷伯特:用算法让机器人飞奔的人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…

信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV

原文链接:信创系统资产清单采集脚本:主机名IPMAC 一键生成 CSV Hello,大家好啊!今天给大家带来一篇在信创终端操作系统上自动批量采集主机名、IP 和 MAC 并导出为 CSV 表格的实战文章!本方案使用 sshpass 和 Bash 脚本…

SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)

文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决:开启驼峰命名和下划线命名的自动转换 设置返回的日期格式 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时,忽略…

Mac下安装Python3,并配置环境变量设置为默认

下载Python 访问Python官方网站 https://www.python.org/ 首先获得python3安装路径 执行命令: which python3 以我这台电脑为例,路径为:/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 编辑 bash_profile 文件 然后用 vim 打…

Linux-04-用户管理命令

一、useradd添加新用户: 基本语法: useradd 用户名:添加新用户 useradd -g 组名 用户:添加新用户到某个组二、passwd设置用户密码: 基本语法: passwd 用户名:设置用户名密码 三、id查看用户是否存在: 基本语法: id 用户名 四、su切换用户: 基本语法: su 用户名称:切换用…

【进阶】--函数栈帧的创建和销毁详解

目录 一.函数栈帧的概念 二.理解函数栈帧能让我们解决什么问题 三.相关寄存器和汇编指令知识点补充 四.函数栈帧的创建和销毁 4.1.调用堆栈 4.2.函数栈帧的创建 4.3 函数栈帧的销毁 一.函数栈帧的概念 --在C语言中,函数栈帧是指在函数调用过程中,…

【一】 基本概念与应用领域【数字图像处理】

考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…

NU1680低成本、无固件、高集成度无线充电电源接收器

无线充电 电子产品具有无线充电功能使用会更便利,介绍一款低成本、无固件、高集成度无线充电电源接收器NU1680 原理图和BOM可点绑定资源下载,LC部分电容建议X7R。 Load空载切满载测试 (CC Mode) – 尽量保证电子负载没有过冲 – 电子负载不要从0到满…

2025MathorCup数学应用挑战赛B题

目录 模型建立与求解 1.问题一的模型建立与求解 1.1 搬迁补偿模型设计 1.2 住户是否搬迁的应对策略与分析 1.3 定量讨论 2.问题二的模型建立与求解 2.1 搬迁方案模型的优化介绍 2.2 模型的评估 2.3 模型结果 3.问题三的模型建立与求解 3.1 拐点存在性分析模型的建立 3.2 模型的…

组件的基本知识

组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签,抽离放在一个独立的vue文件中,以供主vue文件使用 组成 三部分构成 template:HTML 结构 script: JS 逻辑 style: CSS 样…

Origin绘图操作:图中迷你图绘制

一、背景描述 Origin绘图时,局部数据变化较小,在整体图片中表现为局部曲线重叠在一起,图中y1和y2在x0-2时重叠在一起,需要将局部放大,绘制迷你图 二、实现方法 1.在左边工具栏选择放大镜,按住ctrl在图中…

数据升降级:医疗数据的“时空穿梭“系统工程(分析与架构篇)

一、核心挑战与量化分析 1. 版本演化困境的深度解析 (1) 格式断层的结构化危机 数据转换黑洞:某医疗信息平台(2021-2023)统计显示: 数据类型CDA R1→R2转换失败率R2→FHIR转换失败率关键失败点诊断记录28.4%19.7%ICD编码版本冲突(18.7%)用药记录15.2%12.3%剂量单位标准化…