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

多态、虚函数表与动态绑定的深入解析

目录

多态简介

虚函数表与动态绑定

虚函数表

动态绑定机制

内存与性能影响

纯虚函数与抽象类

纯虚函数

抽象类

动态类型转换与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操作符 虚析构函数的重要性 在面向对象编程中&#xff0c;多态性是一种核心特性&#xff0c;它允许我们…...

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&#xff08;可选&#xff09; Docker容器可以从底层虚拟化&#xff0c;使我们能够在 不降级 CUDA驱动程序的情况下使用 任何版本的CU…...

快速学习Java的多维数组技巧

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…...

C语言运算类型有哪些

C语言中的运算类型主要分为以下几类&#xff1a; 1. 算术运算符&#xff1a; - 加法运算符 - 减法运算符 - - 乘法运算符 * - 除法运算符 / - 取模运算符 %&#xff08;取余数&#xff09; 2. 关系运算符&#xff1a; - 大于 > - 小于 < - 大…...

【深度学习】Loss为Nan的可能原因

文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下&#xff0c;我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的&#xff0c;我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…...

解密!考研数学满分学霸的备考书单

这题我太会了&#xff0c;高数视频有是有真的又臭又长&#xff0c;我也不喜欢看 但是自己看教材&#xff0c;有的地方又比较难以理解&#xff0c;所以&#xff0c;这个时候一本通俗易懂的教材就显得格外重要&#xff0c;国内很多教材都讲的晦涩难懂&#xff0c;所以我给大家推…...

AI绘画工具介绍

AI绘画工具是利用人工智能技术帮助用户创作艺术作品的软件或平台。它们通常通过用户输入的描述性文字&#xff0c;自动解析并生成具有特定风格和主题的画作。以下是一些2024年流行的AI绘画工具的介绍&#xff1a; GitMind AI绘画2&#xff1a;一个提供多种语言界面的AI绘画生成…...

【APP逆向】央视频播放量增加,逆向全过程解密

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体&#xff0c;这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统&#xff0c;这一三星系统拥有更大的体积&#xff0c;并且排列也更加紧密&#xff0c;这也使得这一系统更加特别。科学家推测&am…...

【MySQL】(基础篇六) —— 过滤数据

过滤数据 本文将讲授如何使用SELECT语句的WHERE子句指定搜索条件。 WHERE子句 数据库表一般包含大量的数据&#xff0c;很少需要检索表中所有行。通常只会根据特定操作或需要提取表数据的子集。只检索所需数据需要指定搜索条件&#xff08;search criteria&#xff09;&…...

利用 HTML5 Canvas 实现在线签字功能

目录 前言 一、HTML5 Canvas 简介 二、签字功能的实现 效果演示 完整代码 前言 在现代互联网应用中&#xff0c;有时我们需要让用户在网页上进行签字操作&#xff0c;比如确认文件、填写电子表格或者签署合同。利用 HTML5 的 canvas 画布&#xff0c;我们可以轻松地实现这一…...

GaussDB技术解读——GaussDB架构介绍(二)

上篇图文&#xff0c;从GaussDB关键架构目标、GaussDB分布式架构、数据计算路由层&#xff08;Coordinator&#xff09;关键技术方案等三方面对GaussDB架构进行了介绍。本篇将从数据持久化存取层(DataNode)关键技术方案、全局事务管理层&#xff08;GTM&#xff09;关键技术方案…...

EfficientNet详解

原论文名称&#xff1a;EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 论文下载地址&#xff1a;https://arxiv.org/abs/1905.11946 原论文提供代码&#xff1a;https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet 自己…...

UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则

UI前端交互的艺术&#xff1a;探索设计的四个维度、五个层面、六个要点与七大原则 在数字时代的浪潮中&#xff0c;UI前端交互设计如同一门深邃的艺术&#xff0c;既需要技术支撑&#xff0c;又需要设计灵感。它关乎用户体验&#xff0c;影响着产品的成败。那么&#xff0c;UI…...

java接口设计需要考虑哪些方面

1.签名 目的&#xff1a;防止数据被篡改 &#xff08;1&#xff09;接口请求方将请求参数、时间戳和密钥拼接成一个字符串。 &#xff08;2&#xff09;使用MD5等hash算法生成签名。 &#xff08;3&#xff09;在请求参数或请求头中增加sign参数传递给API接口。 &#xff08;4&…...

Opencv图像处理

Opencv图像处理 图像阈值处理 图像阈值的处理通过cv2.threshold函数来进行处理&#xff0c;该函数的具体说明如下所示 ret, dst cv2.threshold(src, thresh, maxval, type) src&#xff1a; 输入图&#xff0c;只能输入单通道图像&#xff0c;通常来说为灰度图 dst&#x…...

LeetCode | 2879.显示前三行

在 pandas 中&#xff0c;可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行&#xff0c;可以在 head() 方法中传入一个参数 n&#xff0c;读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…...

Qt实现简易播放器

效果如图 源码地址&#xff1a; 简易播放器: 基于Qt的简易播放器&#xff0c;底层采用VLC源码 - Gitee.com GitHub:GitHub - a-mo-xi-wei/easy-player: 基于Qt的调用VLC的API的简易播放器...

适配Android12启动页

今天我们讲个什么话题呢&#xff1f;我们今天讲的内容是&#xff0c;Android12新启动页的支持API。 启动页我想大家都不陌生吧&#xff0c;通常的写法就是先创建一个SplashActivity&#xff0c;在onCreate中 Handler(Looper.getMainLooper()).postDelayed({// 在这里跳转主界…...

人工智能在医学领域的应用及技术实现

欢迎来到 Papicatch的博客 目录 &#x1f349;引言 &#x1f349; 医学影像分析 &#x1f348;技术实现 &#x1f34d;数据准备 &#x1f34d;模型构建 &#x1f34d;模型训练 &#x1f34d;模型评估 &#x1f34d;应用部署 &#x1f348;示例代码 &#x1f349; 基因…...

MySQL—多表查询—练习(1)

一、引言 上几篇关于多表查询的基本几个部分全部学习完了。 多表查询的基本类型的查询包括以下&#xff1a; 1、内连接&#xff08;隐式内连接、显示内连接&#xff09;&#xff1a;... [INNER] JOIN ... ON 条件; &#xff09; 2、外连接&#xff08;左外连接、右外连接&…...

千益畅行:合法合规的旅游卡服务,打破误解

近期&#xff0c;千益畅行旅游卡服务引起了公众的广泛关注。然而&#xff0c;一些人对该服务存在误解&#xff0c;认为其存在某种欺诈行为。但经过深入了解和全网搜索证据&#xff0c;我们可以确认&#xff0c;千益畅行实际上是一家合法合规的旅游卡服务提供商。 千益畅行旅游…...

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示&#xff1a; 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…...

怎样把便签里的内容移到桌面?桌面便签软件使用方法

每次打开电脑&#xff0c;我总是被满屏的文件和图标弄得眼花缭乱。那些记录在各式各样便签里的重要事项&#xff0c;经常被埋没在这信息的海洋中&#xff0c;找起来真是头疼。想必很多人都有过这样的困扰&#xff1a;如何在繁杂的桌面环境中&#xff0c;一眼就看到自己需要提醒…...

量化入门:qmt获取可转债基本信息和行情数据

💻专业版获取可转债数据 今天将展示如何使用Python和QMT来获取可转债的实时数据和财务数据。 🔬 获取可转债基本信息 迅投的券商版和基础版都不支持可转债行情,投研专业版才支持,一年大概5000元。免费的券商版可参考QMT量化入门 投研专业版才有权限调用download_cb_d…...

AVL树 ---(C++)

本篇讲全面的讲解 AVL 树的插入&#xff0c;旋转以及验证 AVL 树的性能&#xff08;本篇未实现删除代码&#xff09;。至于为什么会有 AVL 树&#xff0c;这是因为简单的二叉搜索树并不能直接的保证搜索的效率&#xff0c;因为当我们在二叉搜索树中插入一段有序的序列的时候&am…...

基于spring boot+MySQL 小区物业管理系统-计算机毕设 附源码37236

spring boot 小区物业管理系统 摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;小区物业只能以客户为导向&#xff0c;以产品的持续创新作为小区物…...

Linux/Ubuntu/Debian常用服务管理命令

Linux/Ubuntu/Debian常用服务管理命令 在 Linux 系统中&#xff0c;服务管理是系统管理员日常维护工作的重要组成部分。通过一些常用的命令&#xff0c;我们可以查看服务状态、启动或停止服务、重启服务等。掌握这些命令&#xff0c;可以让系统管理工作更加高效和便捷。 1. s…...

Maven的三种项目打包方式——pom,jar,war的区别

1、pom&#xff1a;用在父级工程或聚合工程中&#xff0c;用来做jar包的版本控制&#xff0c;必须指明这个聚合工程的打包方式为pom。 聚合工程只是用来帮助其他模块构建的工具&#xff0c;本身并没有实质的内容。具体每个工程代码的编写还是在生成的工程中去写。 对于在父工程…...

表白网页代码/公司网站优化

在微信里面&#xff0c;是不能通过应用宝以外的方式去直接下载app的&#xff0c;但是却可以通过跳转到浏览器去下载app&#xff0c;因此如果刚好各位公司有刚刚上线的app&#xff0c;可以试试这种办法。 解决方案&#xff1a;弹出一个遮罩&#xff0c;提示用户在浏览器中打开进…...

企业网站seo策略/最新疫情最新情况

一、 Thread类的基本用法 通过System.Threading.Thread类可以开始新的线程&#xff0c;并在线程堆栈中运行静态或实例方法。可以通过Thread类的的构造方法传递一个无参数&#xff0c;并且不返回值&#xff08;返回void&#xff09;的委托(ThreadStart)&#xff0c;这个委托的定…...

网站推广方法有/seo自然排名优化

为什么80%的码农都做不了架构师&#xff1f;>>> 如今&#xff0c;软件通常会作为一种服务来交付&#xff0c;它们被称为网络应用程序&#xff0c;或“软件即服务”&#xff08;SaaS&#xff09;。 “十二要素应用程序”&#xff08;12-Factor App&#xff09;为构建…...

中国互联网协会是什么单位/seo快照推广

一、从一个微信Bug说起 问题&#xff1a;在微信Android客户端&#xff0c;一张七牛CDN上的HTTPS链接的图片&#xff0c;用微信浏览器打开可以正常访问&#xff0c;但是&#xff0c;长按图片保存时&#xff0c;却提示下载图片失败。发现这个问题后&#xff0c;我用了一个简单的测…...

做网站用哪种编程语言/seo搜索引擎入门教程

早些时戴尔发布了SAN Headquarters(SAN HQ) v2.2。这个版本的SAN HQ给用户带来了一些全新的和令人激动的特性。 如果您已经是SAN HQ的用户了&#xff0c;您应该能够意识到SAN HQ的诸多益处。通过发现性能的瓶颈&#xff0c;SAN HQ可以改善整个SAN系统的性能。通过发现那些未被有…...

佛山做网站开发/如何让百度能查到自己

最近很多朋友咨询关于Python如何运行一个python程序的问题&#xff0c;今天的这篇经验就来聊一聊这个话题&#xff0c;希望可以帮助到有需要的朋友。 方法/步骤 1 方法一&#xff1a;使用Python&#xff0c;可以直接在这里写入程序&#xff0c;但若将其关闭&#xff0c;刚才写的…...