c++多态之辨析:静态联编和动态联编

news2024/11/13 16:43:09

C++的几种多态形式

        从广义上来说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载)、强制多态(类型强制转换)、类型参数化多态(模板)和包含多态(继承及虚函数)4种形式来实现。

        重载、模板等多态形式,究竟调用函数哪个的具体实现,在编译阶段就已经确定,我们称前三种多态属于静态联编;而最后一种,即c++狭义上的多态,虚函数则属于动态联编,因为它的具体实现只能在程序运行时根据对象的实际类型确定。

联编

        联编(binding)又称绑定,当我们使用程序调用函数的时候,究竟应该执行函数对应的哪一个代码块呢?将源代码中的函数调用解释为执行特定的函数代码块这个过程被称为函数名联编。     
 

知识扩展:c和c++编译阶段对调用函数的编译处理以及符号表。

静态联编/绑定

        在编译阶段就将函数实现和函数调用绑定起来称为静态联编(static binding),又叫早期绑定。静态联编在编译阶段就必须了解所有的函数或模块执行所需要的信息。在C语言中,所有的联编都是静态联编;在C++中,一般情况下联编也是静态联编。

        不过上面这句话“在C语言中,所有的联编都是静态联编”这里要暂时打个问号,这句话是教科书原话。但是个人理解c的回调函数也属于动态联编,CSDN的chatgpt也可以举证。。。

        如下,以c++的重载为例。main函数中的几个func调用,c++编译器完全可以很明确每个func调用具体去执行哪个实现的。因为,c++在编译阶段,会通过函数名+函数的参数形式 唯一确定一个函数实现。 

//函数重载需要函数都在同一个作用域下
void func(int a)
{
	cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
	cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
	cout << "func (int a ,double b) 的调用!" << endl;
}

int main() {
	func(10);
	func(3.14);
	func(10,3.14);
	
	system("pause");

	return 0;
}

动态联编

        动态联编也称为晚期绑定,是指在运行时根据对象的类型确定方法调用的具体实现。有时候方法调用者和其调用方法之间不是完全确定的,可能需要依赖程序运行起来以后,根据调用者的类型或者传参情况才能把具体实现终于确定下来。

        举个多态虚函数的例子,理解为什么需要动态联编。如下,一个含虚函数的基类animal,两个派生出来的 类cat和dog。我们在不“运行”代码的情况下,同编译器的视角看这段代码。

        当test01方法调用起来后,紧接着里面第一个DoSpeak()调用,显然DoSpeak()里面要执行一个函数调用speak。那么要具体执行sepak的那个实现呢?这个要依赖函数运行起来之后,传入DoSpeak的实参决定,传入cat对象就执行cat的虚函数。也就是说,只有程序运行起来,DoSpeak传入实参,才能确定(绑定)speak的具体实现。

class Animal
{
public:
	//Speak函数就是虚函数
	//函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
	virtual void speak()
	{
		cout << "动物在说话" << endl;
	}
};

class Cat :public Animal
{
public:
	virtual void speak()//子类的函数前面不加virtual 也可以重写,但是不规范不建议。
	{
		cout << "小猫在说话" << endl;
	}
};

class Dog :public Animal
{
public:

	virtual void speak()
	{
		cout << "小狗在说话" << endl;
	}

};
//我们希望调用什么对象中的函数,那么就传入什么对象
//如果函数地址在编译阶段就能确定,那么静态联编
//如果函数地址在运行阶段才能确定,就是动态联编

void DoSpeak(Animal & animal)//注意函数形参
{							 //多态使用:
	animal.speak();			 //父类指针或引用指向子类对象
}

void test01()
{
	Cat cat;
	DoSpeak(cat);


	Dog dog;
	DoSpeak(dog);
}


int main() {

	test01();

	system("pause");

	return 0;
}

静态/动态联编 与 静态/链接链接 概念辨析

两组概念之间没啥关系,说的不是一个事儿

静态链接
在编译成可是执行文件时,自动链接依赖的目标库,如果需要多次链接相同的目标文件,则需要对于目标文件进行多次的拷贝

动态链接
在程序运行时,每次需要连接依赖的动态链接库时,才会连接动态链接库,且改目标文件只有一份拷贝。

参考:

C++静态绑定、动态绑定;静态编译、动态编译;静态链接、动态链接;静态联编、静态联编_c++ 编译 函数绑定 流程_爱学习滴好青年的博客-CSDN博客

C++动态联编介绍-CSDN博客

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

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

相关文章

【Linux】命令lsof使用详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f…

想要成为CSS大师?这些技巧是你必须知道的!

前言 CSS 是网页设计中不可或缺的一部分&#xff0c;掌握一些实用的 CSS 技巧&#xff0c;可以让你在设计中展现出更多的创意和个性。本文将介绍一些 CSS 技巧&#xff0c;帮助你提升自己的技能&#xff0c;成为一个真正的 CSS 大师。 1. 改变 input 自动填充的背景颜色 这段 …

【Linux】缓冲区+磁盘+动静态库

一、缓冲区 1、缓冲区的概念 缓冲区的本质就是一段用作缓存的内存。 2、缓冲区的意义 节省进程进行数据IO的时间。进程使用fwrite等函数把数据拷贝到缓冲区或者外设中。 3、缓冲区刷新策略 3.1、立即刷新&#xff08;无缓冲&#xff09;——ffush() 情况很少&#xff0c…

MacOS - Cpolar 在 Mac 上如何使用?

1、下载并配置环境变量 brew tap probezy/core && brew install cpolar 2、 Token 认证 cpolar authtoken xxx 3、安装服务 sudo cpolar service install 4、启动服务 sudo cpolar service start 5、创建隧道 访问地址&#xff1a;http://127.0.0.1:9200&…

Vue3-provide 和 inject 跨组件传递数据

Vue3-provide 和 inject 跨组件传递数据 功能&#xff1a;将数据从App组件跨过一个组件传递到B组件中provide&#xff1a;提供数据inject&#xff1a;接收数据 // App.vue <template><h2>我是App组件&#xff08;{{num}}&#xff09;</h2><A></A&g…

UASRT(2)

UASRT参数配置 数据发送过程 1.双缓冲 当要发送三个数据 且是连续发送 第一个数据写入TDR寄存器 然后到移位寄存器发送&#xff08;一个一个bit的发送&#xff09;在第一个数据在移位寄存器发送的时候第二个数据就已经被写入TDR寄存器了等到第一个数据发送完第二个数据就进入…

2023年中国农业机器人行业市场规模及发展趋势分析[图]

农业机器人是一种机器&#xff0c;是机器人在农业生产中的运用&#xff0c;是一种可由不同程序软件控制&#xff0c;以适应各种作业,能感觉并适应作物种类或环境变化&#xff0c;有检测(如视觉等)和演算等人工智能的新一代无人自动操作机械。 农业机器人分类 资料来源&#xf…

基于单片机PM2.5监测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机PM2.5监测系统仿真设计 文章目录 一 概要简介设计目标系统组成工作流程仿真设计结论 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机PM2.5监测系统仿真设计介绍 简介 PM2.5&#xff08;可吸…

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…

图神经网络:消息传递算法

一、说明 图网络-GNN&#xff08;Graph Neural Networks&#xff09;是近几年研究的主题之一&#xff0c;虽不及深度神经网络那么火爆&#xff0c;但在一些领域&#xff0c;如分子化学方面是不得不依赖的理论。本文就一些典型意义的图神经网络消息传递展开阐述。 二、图网络简述…

传输层协议 - UDP(User Datagrm Protocol)

文章目录&#xff1a; 传输层再谈端口号端口号划分知名端口号&#xff08;Well-Know Port Number&#xff09;netstat 命令iostat 命令pidof UDP 协议UDP 协议格式UDP 协议的特点面向数据报UDP 的缓冲区UDP 使用注意事项UDP 协议的应用基于 UDP 的应用层协议 在 DDoS 攻击中如何…

bhosts 显示节点 “unreach“ 状态

4.1、bhosts简单使用 查看各节点情况&#xff0c;包括状态和正在运行的 Job 情况等 STATUS列展示节点状态 OK&#xff1a;可用——可接受新的作业的正常状态 unavail&#xff1a;不可用 可能原因&#xff1a;主机关闭&#xff0c;LIM和sbatchd不可达 unreach&#xff1a;无法连…

关于LED显示屏的扫描方式知识

LED显示屏的扫描方式是指LED显示屏如何以一定的顺序控制LED点阵的亮度&#xff0c;从而形成图像或文字。主要有静态扫描和动态扫描两种方式。 静态扫描&#xff08;Static Scan&#xff09;&#xff1a; 描述&#xff1a; 在静态扫描中&#xff0c;LED显示屏的每个LED点都有一个…

【Java SE】 详解java访问限定符

访问限定符 Java中主要通过类和访问权限来实现封装&#xff1a;类可以将数据以及封装数据的方法结合在一起&#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符&#xff1a; 实际只有三种访问限定…

Find My蓝牙耳机|苹果Find My技术与耳机结合,智能防丢,全球定位

蓝牙耳机就是将蓝牙技术应用在免持耳机上&#xff0c;让使用者可以免除恼人电线的牵绊&#xff0c;自在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具。正是应为蓝牙耳机小巧无线&#xff0c;人们越来越喜欢随身携带蓝牙耳机出门&a…

Iris for Mac:简单易用的录屏神器,让你的演示更出色

你是否曾需要在Mac上进行屏幕录制&#xff0c;但却苦于找不到一款简单易用的工具&#xff1f;那么&#xff0c;今天我们将为你介绍一款全新的屏幕录制软件——Iris for Mac。这款软件不仅功能强大&#xff0c;而且操作简单&#xff0c;可以轻松满足你的各种录屏需求。 一、简单…

系列五、线程间通信

一、synchronized实现 1.1、案例一&#xff08;2个线程交替对变量执行1、-1操作&#xff0c;来10轮&#xff09; 1.1.1、资源类ShareDataOne /*** Author : 一叶浮萍归大海* Date: 2023/11/20 10:44* Description: 资源类* 说明&#xff1a;2个线程使用if判断变量的值&#…

Python中用requests时遇到的错误警告解决方案

最近&#xff0c;我在Python 2.7.6&#xff08;Ubuntu 14.04.2 LTS&#xff09;环境中将requests库的版本从2.5.3升级到2.6.0&#xff0c;却遇到了’A true SSLContext object is not available’警告。每当我在Python 2.7.6环境中尝试使用requests库访问’github’时&#xff…

论文笔记:The Impact of AI on Developer Productivity:Evidence from GitHub Copilot

0 abstract 本文介绍了一项对GitHub Copilot&#xff08;一种人工智能编程助手&#xff09;的控制实验结果。研究人员招募了软件开发人员&#xff0c;要求他们尽可能快地用JavaScript实现一个HTTP服务器。实验组可以访问人工智能编程助手&#xff0c;比对照组完成任务的速度快…