C++多态性——(2)联编

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
成功的秘诀就在于多努力一次!

一起加油!

目录

一、前言:

二、静态联编: 

💦例:静态联编带来的一些问题的示例。

🔑说明:

三、动态联编:  

四、总结:

五、共勉:


一、前言:

        多态从实现的角度可以划分为两类:编译时的多态和运行时的多态。编译时的多态是在编译的过程中确定了同名函数具体调用哪一个;而运行时的多态则是在程序运行过程中才动态地确定同名函数具体调用哪一个。这种确定调用具体代码段的过程就是联编。联编就是指计算机程序自身彼此关联的过程:即把一个源程序经过编译、连接,使之成为可执行的程序文件的过程。在这个过程中,计算机程序自身彼此关联,即将函数名和函数体联系在一起,将标识符名和存储地址联系在一起。用面向对象的术语讲,就是把消息和对象的方法相结合的过程。根据联编进行的阶段的不同,可以将其划分为静态联编和动态联编。这两种联编过程分别对应着多态的两种实现方式。

二、静态联编: 

        静态联编支持的多态性,我们将其称为编译时的多态性,又称为静态的多态性,因为联编的过程是在程序开始执行之前进行的在编译、连接的过程中,系统可以根据类型匹配等特征确定程序中调用与具体执行函数的关系,即在哪个地方调用什么函数,此时的多态性就被称为编译时的多态性。

        编译时的多态性可以通过函数重载来实现。函数重载的意义在于它可以用同一个名字访问一组相关的函数,能使用户为某一类操作取一个通用的名字。编译程序在编译时决定选择具体的函数段执行,这种方式也利于解决程序的复杂性。一般的函数和成员函数,构造函数都可以重载。

        C++中通过两种工作方式实现编译的的多态性:函数重载和运算符重载。它们都属于静态联编。

        静态联编函数调用速度快、效率较高,但是编程不灵活。

💦例:静态联编带来的一些问题的示例。

#include<iostream>
using namespace std;
class Space
{private:int x;int y;public:Space(int px,int py):x(px),y(py){cout<<"Space construct called"<<endl;	}	double GetArea(){return 0;}
};
class Rectangle:public Space
{private:double w;double h;public:Rectangle(int px,int py,double pw,double ph):Space(px,py),w(pw),h(ph){cout<<"Rectangle construct called"<<endl;}double GetArea(){return w*h;}
};
class Circle:public Space
{ private:int r;public:Circle(int px,int py,int pr):Space(px,py),r(pr){cout<<"Circle construct called"<<endl;}	double GetArea(){return 3.14*r*r;	}
};
int main(){Rectangle r1(30,40,4,8);Circle cr(30,40,4);Space *p=&r1;cout<<r1.GetArea()<<endl;cout<<p->GetArea()<<endl;p=&cr;cout<<cr.GetArea()<<endl;cout<<p->GetArea()<<endl;return 0;
}

🔑说明:

        根据之前的内容,(1)在构造派生类 Rectangle 对象r1之前,首先会调用基类Shape的构造函数,因此先输出“Shape construct called”,再输出“Rectangle construct called”,构造Circle 类对象cr 也是如此;(2)根据之前介绍的类型兼容性规则,其类指针p,可以指向不同的公有派生类对象,这里指向r1和cr。但是由于程序中完成的是静态联编,在程序编译阶段,基类指针p对于GetArea 方法的调用只能绑定到基类的 GetArea方法上,虽然程序运行时p指向了不同的派生类对象,但由于绑定过程在编译阶段已经完成,所以无论运行时p指向什么类型的对象始终调用的都是基类中的GetArea 方法,因此这种联编方式输出的结果不是我们期望的结果。 

        关于类型兼容原则,在实际应用时需要注意以下几个方面。
(1)基类的指针可以指向它的公有派生类的对象,但是不允许指向它的私有派生类的对象。

(2)派生类的指针不允许指向它基类的对象。

(3)基类的指针指向它的公有派生类的对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类中定义的新成员。

三、动态联编:  

        从上例中可得知有些联编工作不能在编译阶段完成,只有在序运行时才可以确定将要调用的函数。与静态联编相对应,这种绑定工作在程序运行阶段完成,被称为动态联编,又被称为动态绑定。
        动态联编支持性,我们称的多态之为运行时的多态性,也称为动态多态性。在 C++中,运行的多态性,就是动态联编。动态联编提高了编程的灵活性和程序的易维护性,但与静态联编相比,函数调用速度慢。

四、总结:

  • 多态从实现的角度可以划分为两类:编译时的多态和运行时的多态。
  • 确定调用具体代码段的过程就是联编。
  • 联编就是指计算机程序自身彼此关联的过程:即把一个源程序经过编译、连接,使之成为可执行的程序文件的过程。
  • 根据联编进行的阶段的不同,可以将其划分为静态联编和动态联编。
  • 函数重载的意义在于它可以用同一个名字访问一组相关的函数,能使用户为某一类操作取一个通用的名字。
  • 一般的函数和成员函数,构造函数都可以重载。
  • C++中通过两种工作方式实现编译的的多态性:函数重载和运算符重载。它们都属于静态联编。
  • 静态联编函数调用速度快、效率较高,但是编程不灵活。
  • 基类的指针可以指向它的公有派生类的对象,但是不允许指向它的私有派生类的对象。

  • 派生类的指针不允许指向它基类的对象。

  • 基类的指针指向它的公有派生类的对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类中定义的新成员。

  • 动态联编提高了编程的灵活性和程序的易维护性,但与静态联编相比,函数调用速度慢。

五、共勉:

        以上就是我对C++多态性——(2)联编的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!! 

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

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

相关文章

自动化测试中,如何增加失败重试机制!

01、前言 在执行自动化测试用例时&#xff0c;会发现有时候用例失败并非代码问题&#xff0c;而是由于服务正在发版&#xff0c;导致请求失败&#xff0c;从而降低了自动化用例的稳定性&#xff0c;最后还要花时间定位到底是自身case的原因还是业务逻辑问题&#xff0c;还是其…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

​随着市场竞争的加剧和企业规模的扩大&#xff0c;招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量&#xff0c;我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标&#xff0c;使得招标采购的质量更高、速度更快&#xff0c;…

宣传照(私密)勿转发

精美的海报通常都是由UI进行精心设计的&#xff0c;现在有100 件商品需要进行宣传推广&#xff0c;如果每个商品都出一张图显然是不合理的&#xff0c;且商品信息各异。因此需要通过代码的形式生成海报。对此&#xff0c;我也对我宣传一波&#xff0c;企图实现我一夜暴富的伟大…

贪心算法part04 860柠檬水找零 406根据身高重建队列

860 柠檬水找零 406 根据身高重建队列 452 用最少数量的箭引爆气球

六、HTML 段落

HTML 可以将文档分割为若干段落。 一、HTML 段落 段落是通过 <p> 标签定义的。 <p>这是一个段落 </p> <p>这是另一个段落</p> 注意&#xff1a;浏览器会自动地在段落的前后添加空行。&#xff08;</p> 是块级元素&#xff09; 二、不…

[蓝桥杯知识学习] 树链

DFS序 什么是DFS序 怎么求DFS序 进入操作&#xff0c;将有计数 出&#xff1a;可以理解为&#xff0c;没有孩子可以去了&#xff08;不能&#xff0c;向下行动&#xff1a;对应于程序里的入栈&#xff09;&#xff0c;所以回到父结点&#xff08;向上行动&#xff0c;对应于程…

SCENIC+:增强子和基因调控网络的单细胞多组学推理

SCENIC&#xff1a;增强子和基因调控网络的单细胞多组学推理 摘要IntroductionSCENIC 使用超过 30,000 个 TF 基序来预测 eGRNSCENIC 在 PBMC 多组数据上的图示SCENIC prioritizes functional enhancers &#xff08;SCENIC 优先考虑功能增强剂&#xff09;SCENIC simulates ph…

从0到1实战,快速搭建SpringBoot工程

目录 一、前言 二、准备工作 2.1 安装JDK 2.2 安装Maven 2.3 下载IDEA 三、从0到1搭建 3.1 创建SpringBoot工程 3.2 运行SpringBoot工程 四、总结 一、前言 SpringBoot是一个在Spring框架基础上构建的开源框架&#xff0c;不仅继承了Spring框架原有的优秀特性&#x…

Selenium自动化测试之学会元素定位

这是我经常被问到的一个问题&#xff0c;也是我很讨厌回答的问题&#xff0c;因为要想回答这个问题需要知道上下文。什么样式的元素&#xff0c;有哪些属性&#xff0c;是否有表单嵌套&#xff0c;都尝试了哪些定位方法。。。而且没几个提问者能事先详细的说明这些。哪儿像提bu…

centos7通过systemctl启动springboot服务代替java -jar方式启动

背景&#xff1a;以前启动jar包都是通过java -jar&#xff0c;后面了解到一种注册服务式启动jar包的方式&#xff0c;所以做个记录。 注意&#xff1a;我在写该篇博客的时候&#xff0c;给脚本代码都加了#注释来解释该行脚本命令的意思&#xff0c;所以可能出现复制该篇博客脚本…

Android 13 - Media框架(29)- MediaCodec(四)

上一节我们了解了如何通过 onInputBufferAvailable 和 getInputBuffer 获取到 input buffer index&#xff0c;接下来我们一起学习上层如何拿到buffer并且向下写数据的。 1、获取 input Buffer 获取 MediaCodec 中的 buffer 有两种方式&#xff0c;一种是调用 getInputBuffers…

Jsonpath - 数据中快速查找和提取的强大工具

JSON&#xff08;JavaScript Object Notation&#xff09;在现代应用程序中广泛使用&#xff0c;但是如何在复杂的JSON数据中 查找和提取所需的信息呢&#xff1f; JSONPath是一种功能强大的查询语言&#xff0c;可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介…

如何将内容转化为流量?媒介盒子分享

软文营销就是将内容转为流量的常见做法&#xff0c;但是有许多企业在做内容时往往一头雾水导致效果不佳&#xff0c;做内容不是光靠写就可以的&#xff0c;还需要做好选题、类型、结构等&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;如何将内容转化为流量。 一、 确定内…

【SpringBoot开发】之商城项目案例(购物车相关操作)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

2023最新租号平台系统源码支持单独租用或合租使用

这是一款租号平台源码&#xff0c;采用常见的租号模式。目前网络上还很少见到此类类型的源码。 平台的主要功能如下&#xff1a; 支持单独租用或采用合租模式&#xff1b; 采用易支付通用接口进行支付&#xff1b; 添加邀请返利功能&#xff0c;以便站长更好地推广&#xf…

每天刷两道题——第三天

1.1两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09; 输入&#xff1a;[1,2,3,4] 输出&#xff1a;[2,1,4,3…

祝贺首届兽医专业学位研究生创新创业大赛圆满闭幕

为进一步贯彻落实科教兴国、农业强国发展战略&#xff0c;适应兽医行业、产业发展需求&#xff0c;提高兽医专业学位研究生实践创新能力&#xff0c;推动兽医领域高层次应用型人才培养供给侧改革&#xff0c;促进兽医专业学位教育高质量发展&#xff0c;12月28日由中国学位与研…

什么是分布式锁

想象一下&#xff0c;如果没有分布式锁&#xff0c;多个分布式节点同时涌入一个共享资源的访问时&#xff0c;就像一群饥肠辘辘的狼汇聚在一块肉前&#xff0c;谁都想咬一口&#xff0c;最后弄得肉丢了个精光&#xff0c;大家都吃不上。 而有了分布式锁&#xff0c;就像给这块肉…

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

JAVAEE初阶相关内容第二十弹--HTTP协议

写在前&#xff1a;2024年啦&#xff01;新的一年要努力学习啦 本篇博客围绕HTTP协议&#xff0c;对HTTP协议进行了解&#xff0c;需要理解其工作过程&#xff0c;对HTTP协议格式要清楚&#xff0c;通过抓包工具进行协议分析&#xff0c;认识“方法”、“请求报头”&#xff0c…