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++多态性的理解,请持续关注我哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM篇:JVM内存结构

程序计数器 程序计数器英文名叫&#xff1a;Program Counter Register 作用&#xff1a;用来记录下一条jvm指令的地址行号。 先来查看一段jvm指令&#xff0c;这些指令对应的java代码就是输出1-5 操作系统运行该Java程序时具体流程如下 语言解释&#xff1a;源文件通过编译转…

基于机器视觉的害虫种类及计数检测研究-人工智能项目-附代码

概述 农业与民生和经济发展息息相关&#xff0c;对农业发展科学化的关注既是民生需求&#xff0c; 也是经济稳步发展的迫切需求。病虫害是影响农作物生长的重要因素&#xff0c;对农作物的产量和品质都能造成无法估计的损害。 - 针对目前广大农业产区农业植保人员稀缺、病虫害…

从零开始配置kali2023环境:配置jupyter的多内核环境

在kali2023上面尝试用anaconda3&#xff0c;anaconda2安装实现配置jupyter的多内核环境时出现各种问题&#xff0c;现在可以通过镜像方式解决 1. 搜索镜像 ┌──(holyeyes㉿kali2023)-[~] └─$ sudo docker search anaconda ┌──(holyeyes㉿kali2023)-[~] └─$ sudo …

关于this.router 和this.route的总结

this.router 和this.route这2个东西一直在用可是我还是迷迷糊糊的不知道啥啥意思&#xff0c;尤其是idea的提示功能&#xff0c;总是让我一个回车就弄错了。 总结一波&#xff1a; 概述 this.$router(路由实例) : 是VueRouter的实例.包含了很多属性和对象&#xff08;比如 h…

V8R6小版本升级步骤(单机环境)

在KingbaseES V8R6版本提供了sys_upgrade的升级工具。 sys_upgade介绍 sys_upgrade实现KingbaseES服务器实例版本升级。 sys_upgrade 允许将存储在KingbaseES数据文件中的数据升级到一个更高的KingbaseES主版本&#xff0c;而无需进行主版本升级(例如从 V8R6C4 到 V8R6C5)通常…

Django开发5-Django开发知识点快速预览

Django开发知识点快速预览 Django开发1.知识点的回顾&#xff1a;2.Ajax请求3.订单小结图表 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; Django开发 1.知识点的回顾&#xff1a; 安装Django pip install django创建Django项…

通达信佳庆离散指标公式,衡量价格波动率

佳庆离散指标&#xff08;Chaikin Volatility&#xff09;是由股票经纪人Mark Chaikin发明的&#xff0c;通过计算选定时期内最高价和最低价之间的差值来衡量价格波动率&#xff0c;将波动率量化为最高价和最低价之间范围的扩大或缩小。 在技术分析中&#xff0c;波动性具有比…

5 个顶级的免费磁盘分区软件工具评测分享

磁盘分区可能是一个脆弱而复杂的过程&#xff0c;磁盘崩溃或用户设备受到病毒攻击的风险很高。因此&#xff0c;它们很难由用户单独或手动管理。本文详细介绍了可以帮助简化磁盘分区过程的不同软件工具、它们的功能和优点。那么让我们开始吧。 什么是磁盘分区工具&#xff1f;…

常见的锁策略详细讲解(悲观锁 vs 乐观锁,轻量锁 vs 重量锁,自旋锁 vs 互斥锁,公平锁 vs 非公平锁,读写锁等)

文章目录 悲观锁和乐观锁Java中的悲观锁和乐观锁乐观锁常见的两种实现方式版本号机制CAS(compare and swap) 算法乐观锁的缺点 轻量级锁和重量级锁自旋锁 VS 互斥锁公平锁 VS 非公平锁读写锁读写锁的插队策略读写锁的升级策略 可重入锁 VS 不可重入锁 悲观锁和乐观锁 所谓悲观…

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

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

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块&#xff08;Windows10MSVC&#xff09;-CSDN博客]&#xff0c;觉得每次编译转到命令行下paste命令过于麻烦&#xff0c;于是研究了一下在vscode中创建自动编译任务。 经过尝试&#xff0c;在task.json中增加如下代码&#xff1a; {"…

IDEA2023 最新版详细图文安装教程(安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

SpringBoot整合Validator

前言 @Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。 通过对DTO中实体类的约束,可以大大增加代码的简洁性。 错误的状态码 返回的响应码推荐使用400 bad request. 参数注解含义 实体类 /*** @author:…

索引语法SQL性能分析

创建 查看 删除 SQL执行频率 Com后七个下划线 慢查询日志 show profiles explain explain执行计划 各字段含义&#xff1a; 多表查询 根据主键或者唯一索引时会出现const const就已经是很棒的性能了&#xff0c;实际中 NULL几乎不会出现

信息安全管理与评估省赛经验总结

信息技能大赛 在比赛开始之前&#xff0c;一定要检查设配&#xff0c;认真审查注意事项&#xff1b;拿到题之后&#xff0c;把对应设备的基本配置完成&#xff0c;任何异常及时报告&#xff0c;这个时候可以把设备的线链接上配置好&#xff0c;登录清单上管理地址等查看是否能登…

二维码地址门牌系统技术服务:让您的生活更便捷,一码通行,安全无忧

文章目录 前言一、融合二维码技术与门牌的便捷服务二、手机开门便捷功能三、智能化安全保障四、智能化、便捷化的新型技术 前言 在数字化时代&#xff0c;二维码门牌系统技术应运而生&#xff0c;为了满足人们对安全、便捷生活的需求。这项技术将二维码与门牌结合&#xff0c;…

leetcode链表小练(1.反转链表2.链表的中间节点3.合并两个有序链表4.环形链表①5.环形链表②)详解 (୨୧• ᴗ •͈)◞︎ᶫᵒᵛᵉ ♡

目录 一.反转链表 思路一反转指针反向&#xff1a; 思路二头插法&#xff1a; 二.链表的中间节点&#xff1a; 三.合并两个有序数组: 思路一&#xff1a;从头开始&#xff0c;取两个链表中小的那个尾插到新链表。定义指针head,tail指向空&#xff0c;代表新链表的头结点。…

Hive/SparkSQL中UDF/UDTF/UDAF的含义、区别、有哪些函数

Hive官网&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF) 1.UDF(User-Defined Function) 含义 即用户定义函数&#xff0c;UDF用于处理一行数据并返回一个标量值(单个值)&#x…

测试自动创建设备节点的功能

一. 简介 上一篇文章在 新设备驱动框架代码的基础上&#xff0c;添加了自动创建设备节点的代码。文章地址如下&#xff1a; 自动创建设备节点代码的实现-CSDN博客 本文对自动创建设备节点的功能进行测试。 二. 自动创建设备节点代码的测试 1. 编译驱动&#xff0c;并拷贝…

关于编程模式的总结与思考

淘宝创新业务的优化迭代是非常高频且迅速的&#xff0c;在这过程中要求技术也必须是快且稳的&#xff0c;而为了适应这种快速变化的节奏&#xff0c;我们在项目开发过程中采用了一些面向拓展以及敏捷开发的设计&#xff0c;本文旨在总结并思考其中一些通用的编程模式。 前言 静…