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

C++ 中面向对象编程如何实现动态绑定?

在 C++ 中,动态绑定(Dynamic Binding)是通过 虚函数(virtual function) 和 多态性(polymorphism) 来实现的。这是面向对象编程的重要特性之一,它允许程序在运行时根据对象的实际类型调用对应的方法,而不是在编译时决定。

动态绑定的实现

动态绑定通常通过以下步骤实现:

  1. 使用基类定义虚函数:在基类中用 virtual 关键字声明函数,使其成为虚函数。
  2. 派生类重写虚函数:在派生类中,重写基类的虚函数。
  3. 通过基类指针或引用调用虚函数:使用基类的指针或引用指向派生类对象时,虚函数调用将根据实际对象类型进行绑定,而不是指针或引用的类型。
  4. 运行时决定调用的函数:通过虚函数表(vtable)和虚指针(vptr)的机制,程序在运行时决定调用派生类的具体实现。
#include <iostream>
using namespace std;// 基类
class Base {
public:virtual void show() { // 虚函数cout << "Base class show function" << endl;}virtual ~Base() {} // 虚析构函数,确保析构时调用正确的析构函数
};// 派生类
class Derived : public Base {
public:void show() override { // 重写虚函数cout << "Derived class show function" << endl;}
};int main() {Base* basePtr;         // 基类指针Derived derivedObj;    // 派生类对象basePtr = &derivedObj; // 基类指针指向派生类对象// 动态绑定:调用的是派生类的 show 函数basePtr->show();return 0;
}/*
Derived class show function
*/

运行机制

  • 虚函数表(VTable)

编译器为每个含虚函数的类生成一个虚函数表(vtable),其中存储了该类中虚函数的地址。

  • 虚指针(VPTR)

每个对象中都有一个指向虚函数表的指针(vptr)。当通过基类指针或引用调用虚函数时,程序会通过虚指针查找虚函数表中对应的函数地址,并调用实际的函数。

注意事项

  1. 虚函数的性能开销:虚函数的调用通过虚表查找,因此会有轻微的性能开销,但一般可以忽略不计。
  2. 虚析构函数:如果一个类有可能被继承且通过基类指针或引用删除对象,则应该为基类添加虚析构函数,以确保正确调用派生类的析构函数。
  3. 纯虚函数与抽象类:如果基类的某个函数声明为纯虚函数(virtual void func() = 0;),则该类为抽象类,不能实例化。

相关文章:

C++ 中面向对象编程如何实现动态绑定?

在 C 中&#xff0c;动态绑定&#xff08;Dynamic Binding&#xff09;是通过 虚函数&#xff08;virtual function&#xff09; 和 多态性&#xff08;polymorphism&#xff09; 来实现的。这是面向对象编程的重要特性之一&#xff0c;它允许程序在运行时根据对象的实际类型调…...

微服务-01

1.认识微服务 1.1 单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;顾名思义&#xff0c;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署时需要对所有模块一起编译、打包&#xff1b;项目的架构设计、开发模式都非常简单。 当项目…...

这是一个vue3 + scss的数字滚动效果

介绍: 当数字变化时&#xff0c;只改变变化的数字位&#xff0c;其余的不变&#xff0c;可以递增、递减、骤变、负数也可以&#xff0c;但是样式要根据具体的项目需求去改&#xff1b; 效果1、增加数字&#xff1a; 效果2、减少数字&#xff1a; 使用方法&#xff1a; <te…...

数字证书管理工具 openssl keytool

OPENSSL 命令 openssl command [ command_opts ] [ command_args ] 常用command: version 用于查看版本信息 enc 用于加解密 ciphers 列出加密套件 genrsa 用于生成私钥 -des|-des3|-idea&#xff1a;用来加密私钥文件的三种对称加密算法。 rsa …...

Polars数据聚合与旋转实战教程

在这篇博文中&#xff0c;我们的目标是解决数据爱好者提出的一个常见问题&#xff1a;如何有效地从Polars DataFrame中创建汇总视图&#xff0c;以便在不同时间段或类别之间轻松进行比较。我们将使用一个实际的数据集示例来探索实现这一目标的各种方法。 Polars简介 Polars 是…...

引用类型集合的深拷贝,无需手动写循环:Apache Commons Lang (SerializationUtils)

在java中&#xff0c;我们如果想要对引用类型的集合进行深拷贝。有一种方式&#xff0c;就是调用SerializationUtils Apache Commons Lang (SerializationUtils) Apache Commons Lang 提供了 SerializationUtils 类&#xff0c;可以利用 Java 的序列化机制来进行集合及其元素…...

HTML、CSS表格的斜表头样式设置title 画对角线

我里面有用到layui框架的影响&#xff0c;实际根据你自己的框架来小调下就可以 效果如下 上代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了&#xff0c;可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 &#xff0c;演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …...

Kioptrix level3

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

UE5 Lyra项目源码分析-关卡配置加载

最近刚学完一套教程&#xff0c;准备研究研究官方的源码&#xff0c;看看自己能不能看懂。 当前分析只在本人能力之下能够分析的内容&#xff0c;如果有一些问题&#xff0c;还请大家指出。 开始 如果你打开一个别人的项目&#xff0c;你会从哪里看起&#xff0c;如果是我&am…...

Cursor重置机器码-解决Too many free trials.

参考文章&#xff1a;如何绕过Cursor的机器绑定限制 前言 在前面这篇文章无限使用Cursor指南中&#xff0c;我提到使用 无限邮箱 或者 删除账号并重新注册 的方法&#xff0c;来无限使用Cursor免费版。但是当在本机登录过3个账号后&#xff0c;就会报这个“Too many free tria…...

transformer学习笔记-自注意力机制(2)

经过上一篇transformer学习笔记-自注意力机制&#xff08;1&#xff09;原理学习&#xff0c;这一篇对其中的几个关键知识点代码演示&#xff1a; 1、整体qkv注意力计算 先来个最简单未经变换的QKV处理&#xff1a; import torch Q torch.tensor([[3.0, 3.0,0.0],[0.5, 4…...

呼叫中心呼入大模型如何对接传统呼叫中心系统?

呼叫中心呼入大模型如何对接传统呼叫中心系统&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 呼叫中心呼入大模型与传统呼叫中心系统的对接是一个复杂而细致的过程&#xff0c;涉及技术实现、流程…...

[Unity] Text文本首行缩进两个字符

Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如&#xff1a; 效果&#xff1a; 代码&#xff1a; TMPtext1.text "\u3000\u3000" "选择动作类型&#xff1a;";...

最新版Chrome浏览器加载ActiveX控件之Adobe PDF阅读器控件

背景 Adobe PDF阅读器控件是一个ActiveX控件&#xff0c;用于在Windows平台上显示和操作PDF文件。它提供了一系列方法和属性&#xff0c;可以实现对PDF文件的加载、显示、搜索、打印、保存等操作。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件…...

springboot 对接 ollama

spring ai 对接 ollama 引入依赖 <dependency><groupId>io.springboot.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId><version>1.0.0</version> </dependency>这里因为使用的是快照版本所以需…...

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…...

从0开始写android 之xwindow

模拟实现android的窗口系统本质上还是在ubuntu 上实现自己的窗口系统&#xff0c; xwindow是一套成熟的解决方案。在ubuntu上使用xwindow的好处之一 是ubuntu自带xwindow的库&#xff0c; 直接引用头文件和库文件。下面来了解下 xwindow的基本函数接口。 参考 https://tronche…...

The Past, Present and Future of Apache Flink

摘要&#xff1a;本文整理自阿里云开源大数据负责人王峰&#xff08;莫问&#xff09;在 Flink Forward Asia 2024上海站主论坛开场的分享&#xff0c;今年正值Flink开源项目诞生的第10周年&#xff0c;借此时机&#xff0c;王峰回顾了Flink在过去10年的发展历程以及 Flink社区…...

多模块应用、发布使用第三方库(持续更新中)

目录: 1、多模块概述&#xff08;HAP、HSP、HAR&#xff09; HAR与HSP两种共享包的主要区别体现在&#xff1a; 2、三类模块&#xff1a; 3、创建项目&#xff1a;项目名&#xff1a;meituan &#xff08;1&#xff09;创建Ability类型的Module&#xff0c;编译后为HAP文件…...

如何快速为小爱音箱添加AI大脑:终极智能升级指南

如何快速为小爱音箱添加AI大脑&#xff1a;终极智能升级指南 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 想让家中的小爱音箱从"人工智障…...

DownKyi完整指南:三步掌握B站8K超高清视频下载

DownKyi完整指南&#xff1a;三步掌握B站8K超高清视频下载 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。…...

GradCAM原理与PyTorch实战:让CNN模型决策可解释

1. 项目概述&#xff1a;为什么我坚持把 GradCAM 当成模型诊断的听诊器用在实验室里调试一个图像分类模型时&#xff0c;我遇到过最尴尬的场景不是准确率上不去&#xff0c;而是模型“答对了题&#xff0c;但完全没看题”。有一次&#xff0c;我们训练了一个猫狗二分类模型&…...

ElevenLabs青少年语音TTS效果对比测试:12款竞品横评,仅2家通过COPPA 3.0儿童语音伦理认证

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ElevenLabs青少年语音TTS的技术定位与伦理边界 ElevenLabs推出的青少年语音合成&#xff08;Teen Voice TTS&#xff09;并非简单的声音风格扩展&#xff0c;而是基于多说话人自监督表征学习与音色解耦建模的高…...

CH347玩转双模式:一篇教程搞定JTAG和SWD对STM32的调试与下载

CH347双模式实战指南&#xff1a;JTAG与SWD高效切换玩转STM32开发 第一次接触CH347这颗多功能接口芯片时&#xff0c;我正被手头几个不同调试接口的项目折腾得焦头烂额。有的客户板子只留了SWD接口&#xff0c;有的老项目又必须用JTAG&#xff0c;来回切换调试器不仅麻烦&#…...

Serverless多事件触发器:提升FaaS效率的关键技术

1. Serverless计算中的多事件触发器&#xff1a;突破传统FaaS的局限在当今云原生架构中&#xff0c;Serverless计算已成为构建弹性应用的重要范式。作为其核心组件的函数即服务(FaaS)平台&#xff0c;如AWS Lambda和Google Cloud Functions&#xff0c;通过事件驱动机制实现了资…...

别再重复造轮子了!这个开源论坛小程序(Java+Uniapp)一套代码搞定 App/小程序/H5/PC,私域流量神器

你是否有过这些想法&#xff1f; 我想做个类似“知识星球”的圈子小程序&#xff0c;但外包报价动辄 5 万起…… 公司要做私域社区&#xff0c;需要同时支持微信小程序和 App&#xff0c;难道要养两个开发团队&#xff1f; 想靠“付费帖子 会员 打赏”变现&#xff0c;去哪…...

COLMAP实战:如何用命令行搞定无人机航拍图像的三维重建?

COLMAP实战&#xff1a;如何用命令行搞定无人机航拍图像的三维重建&#xff1f; 无人机航拍技术正在彻底改变测绘、考古、农业和工程巡检等领域的工作方式。想象一下&#xff0c;你刚刚完成了一次大规模的无人机航拍任务&#xff0c;带回了数百甚至数千张高分辨率图像。这些图像…...

嵌入式核心板选型与开发实战:M28x-T与M6G2C硬件设计及AWorks平台应用

1. 项目概述&#xff1a;为什么我们需要“一体化”核心板&#xff1f;在嵌入式产品开发&#xff0c;尤其是工业控制、数据采集这类对稳定性和开发效率要求极高的领域&#xff0c;很多工程师都经历过一个痛苦的过程&#xff1a;选型一颗主控MCU&#xff0c;然后围绕它去设计DDR内…...

SpringBoot+Vue毕业生追踪系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...