多态、虚函数表与动态绑定的深入解析
目录
多态简介
虚函数表与动态绑定
虚函数表
动态绑定机制
内存与性能影响
纯虚函数与抽象类
纯虚函数
抽象类
动态类型转换与typeid操作符
dynamic_cast
typeid操作符
虚析构函数的重要性
在面向对象编程中,多态性是一种核心特性,它允许我们以统一的接口处理不同类型的对象,从而提高代码的灵活性和可扩展性。本文将深入探讨多态的概念,包括虚函数表、动态绑定的机制,以及它们对内存和性能的影响,并通过具体示例加以说明。
多态简介
多态性允许子类重写基类中的方法,使得通过基类引用来调用这些方法时,实际执行的是子类中对应的实现。这一特性在C++中主要通过虚函数来实现。
class Animal {
public:virtual void speak() { cout << "Some animal sound" << endl; }
};class Dog : public Animal {
public:void speak() override { cout << "Woof!" << endl; }
};int main() {Animal* pet = new Dog();pet->speak(); // 输出 "Woof!"delete pet;
}
在这个例子中,Animal 类定义了一个虚函数 speak(),Dog 类继承自 Animal 并重写了 speak() 方法。通过基类指针 pet 调用 speak(),由于多态的存在,输出的是 "Woof!",而非 "Some animal sound"。
虚函数表与动态绑定
虚函数表
每个包含虚函数的类都会有一个虚函数表(vtable),它是一个存储虚函数指针的数组。当创建此类的对象时,对象会有一个隐藏的指针(vptr)指向这个表。子类的虚函数表会继承并可能覆盖基类的虚函数。
动态绑定机制
动态绑定(也称作迟后联编)是在运行时确定调用哪个函数版本的过程。对于虚函数调用,编译器生成的代码会在运行时检查对象的实际类型,然后调用相应的函数版本。
内存与性能影响
- 内存开销:虚函数表及其指针增加了每个对象的内存占用。
- 执行时间:虚函数调用相较于非虚函数调用有额外的查找过程,可能导致性能下降。
- 内联优化:编译器难以对虚函数进行内联优化,可能影响执行效率。
纯虚函数与抽象类
纯虚函数
class Shape {
public:virtual float area() const = 0; // 纯虚函数
};
纯虚函数没有具体实现,要求派生类必须给出定义
抽象类
含有纯虚函数的类被称为抽象类,不能实例化,但可以作为其他类的基类。
动态类型转换与typeid操作符
dynamic_cast
Animal* pet = new Cat();
Cat* cat = dynamic_cast<Cat*>(pet);
if (cat) {cout << "Pet is a cat." << endl;
} else {cout << "Pet is not a cat." << endl;
}
dynamic_cast 可以安全地尝试将基类指针转换为派生类指针,如果转换不合法,则返回 nullptr(指针)或抛出异常(引用)。
typeid操作符
cout << typeid(*pet).name() << endl; // 输出类型信息
typeid 用于获取对象的实际类型信息,对于多态对象,它可以反映出动态类型。
虚析构函数的重要性
class Base {
public:virtual ~Base() { /* 清理基类资源 */ }
};class Derived : public Base {// 忽略虚析构函数~Derived() { /* 清理派生类资源 */ }
};int main() {Base* basePtr = new Derived();delete basePtr; // 派生类资源未被正确释放
}
若基类的析构函数不是虚函数,通过基类指针删除派生类对象时,只会调用基类的析构函数,导致派生类特有的资源未被释放。因此,基类的析构函数通常应声明为虚函数,确保所有资源被正确清理。
本文通过对多态、虚函数表、动态绑定的机制及其影响的介绍,结合具体示例,深入浅出地解析了这些概念,希望对理解C++中的多态性有所帮助。
相关文章:
多态、虚函数表与动态绑定的深入解析
目录 多态简介 虚函数表与动态绑定 虚函数表 动态绑定机制 内存与性能影响 纯虚函数与抽象类 纯虚函数 抽象类 动态类型转换与typeid操作符 dynamic_cast typeid操作符 虚析构函数的重要性 在面向对象编程中,多态性是一种核心特性,它允许我们…...
VitePress+Docker+jenkins构建个人网站
VitePress官网 VitePress | 由 Vite 和 Vue 驱动的静态站点生成器 可以理解为一个前端脚手架:快速生成个人站点 最好先大概看一遍 快速开始 | VitePress 可以在线体验一下 安装条件 node -v 检查下node版本 在D盘创建一个文件夹 例如:VitePress 进入文件夹 cmd npm ini…...
Windows11下Docker使用记录(五)
目录 准备1. WSL安装cuda container toolkit2. win11 Docker Desktop 设置3. WSL创建docker container并连接cuda4. container安装miniconda(可选) Docker容器可以从底层虚拟化,使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…...
快速学习Java的多维数组技巧
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...
C语言运算类型有哪些
C语言中的运算类型主要分为以下几类: 1. 算术运算符: - 加法运算符 - 减法运算符 - - 乘法运算符 * - 除法运算符 / - 取模运算符 %(取余数) 2. 关系运算符: - 大于 > - 小于 < - 大…...
【深度学习】Loss为Nan的可能原因
文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下,我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的,我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…...
解密!考研数学满分学霸的备考书单
这题我太会了,高数视频有是有真的又臭又长,我也不喜欢看 但是自己看教材,有的地方又比较难以理解,所以,这个时候一本通俗易懂的教材就显得格外重要,国内很多教材都讲的晦涩难懂,所以我给大家推…...
AI绘画工具介绍
AI绘画工具是利用人工智能技术帮助用户创作艺术作品的软件或平台。它们通常通过用户输入的描述性文字,自动解析并生成具有特定风格和主题的画作。以下是一些2024年流行的AI绘画工具的介绍: GitMind AI绘画2:一个提供多种语言界面的AI绘画生成…...
【APP逆向】央视频播放量增加,逆向全过程解密
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
三星系统因何而成?或许是因为吞噬了第四颗恒星
相比于其他的类似星体,这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统,这一三星系统拥有更大的体积,并且排列也更加紧密,这也使得这一系统更加特别。科学家推测&am…...
【MySQL】(基础篇六) —— 过滤数据
过滤数据 本文将讲授如何使用SELECT语句的WHERE子句指定搜索条件。 WHERE子句 数据库表一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或需要提取表数据的子集。只检索所需数据需要指定搜索条件(search criteria)&…...
利用 HTML5 Canvas 实现在线签字功能
目录 前言 一、HTML5 Canvas 简介 二、签字功能的实现 效果演示 完整代码 前言 在现代互联网应用中,有时我们需要让用户在网页上进行签字操作,比如确认文件、填写电子表格或者签署合同。利用 HTML5 的 canvas 画布,我们可以轻松地实现这一…...
GaussDB技术解读——GaussDB架构介绍(二)
上篇图文,从GaussDB关键架构目标、GaussDB分布式架构、数据计算路由层(Coordinator)关键技术方案等三方面对GaussDB架构进行了介绍。本篇将从数据持久化存取层(DataNode)关键技术方案、全局事务管理层(GTM)关键技术方案…...
EfficientNet详解
原论文名称:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 论文下载地址:https://arxiv.org/abs/1905.11946 原论文提供代码:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet 自己…...
UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则
UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则 在数字时代的浪潮中,UI前端交互设计如同一门深邃的艺术,既需要技术支撑,又需要设计灵感。它关乎用户体验,影响着产品的成败。那么,UI…...
java接口设计需要考虑哪些方面
1.签名 目的:防止数据被篡改 (1)接口请求方将请求参数、时间戳和密钥拼接成一个字符串。 (2)使用MD5等hash算法生成签名。 (3)在请求参数或请求头中增加sign参数传递给API接口。 (4&…...
Opencv图像处理
Opencv图像处理 图像阈值处理 图像阈值的处理通过cv2.threshold函数来进行处理,该函数的具体说明如下所示 ret, dst cv2.threshold(src, thresh, maxval, type) src: 输入图,只能输入单通道图像,通常来说为灰度图 dst&#x…...
LeetCode | 2879.显示前三行
在 pandas 中,可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行,可以在 head() 方法中传入一个参数 n,读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…...
Qt实现简易播放器
效果如图 源码地址: 简易播放器: 基于Qt的简易播放器,底层采用VLC源码 - Gitee.com GitHub:GitHub - a-mo-xi-wei/easy-player: 基于Qt的调用VLC的API的简易播放器...
适配Android12启动页
今天我们讲个什么话题呢?我们今天讲的内容是,Android12新启动页的支持API。 启动页我想大家都不陌生吧,通常的写法就是先创建一个SplashActivity,在onCreate中 Handler(Looper.getMainLooper()).postDelayed({// 在这里跳转主界…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
