动态绑定和静态绑定

在C++中,绑定(Binding)通常指的是将函数名(或其他标识符)与其实现(或值)关联起来的过程。这可以发生在编译时(静态绑定)或运行时(动态绑定)。以下是关于静态绑定和动态绑定的一些示例和基本概念:

举个例子

class Base {
public:virtual void show() { // 虚函数,用于动态绑定std::cout << "Base::show()" << std::endl;}void nonVirtualShow() { // 非虚函数,用于静态绑定std::cout << "Base::nonVirtualShow()" << std::endl;}
};class Derived : public Base {
public:void show() override { // 重写基类的虚函数,用于动态绑定std::cout << "Derived::show()" << std::endl;}void nonVirtualShow() { // 重写基类的非虚函数,用于静态绑定std::cout << "Derived::nonVirtualShow()" << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // 动态绑定,调用 Derived::show()basePtr->nonVirtualShow(); // 静态绑定,调用 Base::nonVirtualShow()delete basePtr;return 0;
}

在这个例子中,basePtr 是一个指向 Derived 对象的 Base 类指针。调用 show() 时,由于它是虚函数,所以会发生动态绑定,实际调用的是 Derived::show()。而调用 nonVirtualShow() 时,由于它不是虚函数,所以会发生静态绑定,实际调用的是 Base::nonVirtualShow(),即使 basePtr 实际上指向的是一个 Derived 对象。

静态绑定(Static Binding)

编译时确定:在编译阶段,编译器已经确定了函数或变量的实际调用或引用。
非多态性:不涉及多态性的函数调用通常是静态绑定的。
示例:
函数重载(Overloading):编译器根据提供的参数类型在编译时确定调用哪个函数。
变量引用:当你引用一个非指针、非引用的变量时,编译器知道这个变量的确切地址和类型。

动态绑定(Dynamic Binding)

运行时确定:在运行时,程序根据某些条件(如对象的实际类型)来确定应该调用哪个函数或引用哪个变量。
多态性:多态性是通过动态绑定实现的。
只有虚函数才使用的是动态绑定,其他的全部是静态绑定。
示例:
虚函数(Virtual Functions):当你通过基类指针或引用来调用一个虚函数时,实际调用的函数版本取决于指针或引用所指向的对象的实际类型。这是通过虚函数表(vtable)和动态类型信息(RTTI)来实现的。
继承与多态性:当子类重写了基类的虚函数时,通过基类指针或引用来调用该函数将触发动态绑定,并调用子类的版本。

注意事项

静态绑定通常更快:因为编译器在编译时已经确定了所有的调用和引用,所以它可以进行更多的优化。
动态绑定更灵活:它允许你在运行时根据对象的实际类型来改变行为。
C++中的动态绑定主要通过虚函数来实现:虚函数是C++中多态性的关键部分。
RTTI(运行时类型识别):虽然C++支持RTTI,但通常建议谨慎使用,因为它可能会引入一些额外的开销和复杂性。

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

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

相关文章

python多标签图像分类的图片相册共享交流系统vue+django

建立图片共享系统&#xff0c;进一步提高用户对图片共享信息的查询。帮助用户和管理员提高工作效率&#xff0c;实现信息查询的自动化。使用本系统可以轻松快捷的为用户提供他们想要得到的图片共享信息。 根据本系统的基本设计思路&#xff0c;本系统在设计方面前台采用了pytho…

区块链中MEV攻击:危害与防护策略

MEV攻击科普&#xff1a;揭秘、危害与防护策略 什么是MEV攻击及危害 在加密货币和区块链的世界里&#xff0c;MEV&#xff08;最大化提取价值&#xff0c;Maximal Extractable Value&#xff09;攻击是一种日益受到关注的现象&#xff0c;它涉及交易者、矿工或验证者利用信息…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 示例代码如下&#xff1a; import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

Star15.3k,开源数据可视化分析工具项目

好东西来了&#xff0c;这是一个人人可用的开源数据可视化分析工具项目&#xff0c;V 哥迫不及待的要给大家推荐这个项目&#xff0c;帆软、Tableau 等商业 BI 工具的开源替代&#xff0c;已在 Github 上被 Star了15.3k了&#xff0c;大家一起来了解一下。自己搭建起来可用&…

Svelte框架:编译时优化的高性能前端框架

Svelte是一款新兴的前端框架&#xff0c;以其独特的编译时优化机制著称&#xff0c;能够在构建时将复杂的UI逻辑转换为高效的JavaScript代码&#xff0c;从而实现高性能的Web应用。本文将深入解析Svelte的架构、核心概念以及代码优化策略。 2024年礼包&#xff1a;2500G计算机…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

2024.5.12每日一题

LeetCode 吃掉N个橘子的最少天数 题目链接&#xff1a;1553. 吃掉 N 个橘子的最少天数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 厨房里总共有 n 个橘子&#xff0c;你决定每一天选择如下方式之一吃这些橘子&#xff1a; 吃掉一个橘子。如果剩余橘子数 n 能被 2 …

数智化浪潮下,透视中建信息的“生态底色”

数智化浪潮正滚滚来袭&#xff0c;成为强劲的经济引擎。 根据国家统计局最新披露的数据&#xff0c;2023年中国数字经济核心产业增加值估计会超过12万亿元&#xff0c;占GDP比重10%左右。 对于众多企业而言&#xff0c;眼下思考的已经不是要不要布局数智化&#xff0c;而是如…

一个人结婚生娃后,就成熟了

文|洪生鹏 大家好&#xff0c;我是老洪。 今日偶然瞥见一个引人深思的话题——你认为成熟的标志是什么&#xff1f; 这个话题如同一股清泉&#xff0c;瞬间激起了我心中的波澜&#xff0c;让我忍不住想和大家分享一些个人的感悟。 青春&#xff0c;如同一首欢快的歌&#xff0c…

Golang | Leetcode Golang题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; func maximalRectangle(matrix [][]byte) (ans int) {if len(matrix) 0 {return}m, n : len(matrix), len(matrix[0])left : make([][]int, m)for i, row : range matrix {left[i] make([]int, n)for j, v : range row {if v 0 {continu…

Disk Map for Mac,让您的Mac更“轻”松

还在为Mac磁盘空间不足而烦恼吗&#xff1f;Disk Map for Mac来帮您轻松解决&#xff01;通过独特的TreeMap视觉显示技术&#xff0c;让您一眼就能看出哪些文件和文件夹占用了大量空间。只需简单几步操作&#xff0c;即可快速释放磁盘空间&#xff0c;让您的Mac更“轻”松。快来…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

图鸟UI vue3:基于Vue3和UniApp的酷炫简洁UI框架

引言 随着前端技术的不断发展&#xff0c;开发效率和用户体验成为了前端开发中的两大关键因素。为了提高开发效率和提供更好的用户体验&#xff0c;各种UI框架应运而生。其中&#xff0c;TuniaoUI作为一款基于Vue3和UniApp开发的UI组件库&#xff0c;以其酷炫简洁的设计和丰富…

如何通过iptables配置URL过滤黑名单?

正文共&#xff1a;1555 字 16 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们前面曾经简单介绍过URL过滤功能&#xff08;URL过滤功能了解一下&#xff1f;&#xff09;&#xff0c;并且以H3C VFW为例简单配置了一下URL过滤功能。 首先回顾一下&#xff0c;URL过滤&#…

头歌C语言数据结构(队列的应用)

第1关&#xff1a;循环队列 任务描述 本关任务&#xff1a;编写一个循环队列&#xff0c;实现入队、出队操作&#xff0c;判断队空、队满等特殊情况。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.循环队列定义&#xff0c;2.入队、出队的定义&#xff…

深入理解C++中的Vector容器:用容器构建高效程序

文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现&#xff0c;C的这个部分内容就是众所周知的STL&#xff08;标准模版库&#xff09;&a…

网络层(计算机网络谢希仁第八版)——学习笔记四

关于网络层的争论 争论的内容&#xff1a;网络层应该想运输层提供正阳的服务&#xff0c;是“面向连接的”还是“无连接”。 其实质就是&#xff1a;可靠交付应该交给谁负责&#xff1f;面向连接表示网络层负责可靠交付&#xff0c;无连接则是把这个任务交给运输层。 让网络层负…

C++笔记(STL标准库)

1.STL六大部件 容器 Containers分配器 Allocators&#xff1a;帮容器分配内存算法 Algorithms迭代器 Iterators&#xff1a;算法通过迭代器操作容器里的数据&#xff0c;是一种泛化的指针适配器 Adapters&#xff1a;修改或扩展已有类或函数的接口以满足特定的需求仿函数 Func…

Java13基础(StringBuilder和StringBuffer 包装类)

目录 一. StringBuilder和StringBuffer 扩容机制&#xff1a; 链式操作&#xff1a; 一些方法&#xff1a; 区别&#xff1a; 小结&#xff1a; 二. 包装类 创建对象&#xff1a; 自动装箱&#xff1a; 自动拆箱&#xff1a; 缓存池&#xff1a; 进制转换&#xff1…

亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件

一款将wordpress文章同步到其他WordPress网站的插件&#xff0c;通过这款插件&#xff0c;可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤&#xff1a; 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹&#xff0c;然后启用插…