c++ 静态联编+动态联编 (多态)

静态多态 +动态多态

1)静态多态动态多态的区别就是函数地址早绑定(静态联编)还是晚绑定(动态联编)。

如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。

而如果函数的调用地址不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。

2)运算符重载函数重载就是编译时多态,而派生类虚函数实现运行时多态

动态多态产生条件

1)先有继承关系
2)父类中有虚函数,子类重写父类虚函数
3)父类的指针或引用指向子类对象

注:对于有父子关系的两个类,指针或者引用是可以转换的。

动态多态 +虚函数 原理

原理

在这里插入图片描述

通过指针偏移调用虚函数

在这里插入图片描述

利用多态实现计算器(案列)

常规思路

这种程序不利于扩展,维护困难,如果修改功能或者扩展功能需要在源代码基础上修改

面向对象程序设计一个基本原则:开闭原则(对修改关闭,对扩展开放)

//计算器
class Caculator{
public:
	void setA(int a){
		this->mA = a;
	}
	void setB(int b){
		this->mB = b;
	}
	void setOperator(string oper){
		this->mOperator = oper;
	}
	int getResult(){
		
		if (this->mOperator == "+"){
			return mA + mB;
		}
		else if (this->mOperator == "-"){
			return mA - mB;
		}
		else if (this->mOperator == "*"){
			return mA * mB;
		}
		else if (this->mOperator == "/"){
			return mA / mB;
		}
	}
private:
	int mA;
	int mB;
	string mOperator;
};


利用多态实现
//抽象基类
class AbstractCaculator{
public:
	void setA(int a){
		this->mA = a;
	}
	virtual void setB(int b){
		this->mB = b;
	}
	virtual int getResult() = 0;
protected:
	int mA;
	int mB;
	string mOperator;
};

//加法计算器
class PlusCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA + mB;
	}
};

//减法计算器
class MinusCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA - mB;
	}
};

//乘法计算器
class MultipliesCaculator : public AbstractCaculator{
public:
	virtual int getResult(){
		return mA * mB;
	}
};

void DoBussiness(AbstractCaculator* caculator){
	int a = 10;
	int b = 20;
	caculator->setA(a);
	caculator->setB(b);
	cout << "计算结果:" << caculator->getResult() << endl;
	delete caculator;
}

多态性改善了代码的可读性和组织性,同时也使创建的程序具有可扩展性,项目不仅在最初创建时期可以扩展,而且当项目在需要有新的功能时也能扩展。

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

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

相关文章

HTML+CSS+JavaScript制作电子时钟

一 效果展示 二 步骤 在网上下载0-9的jpg图片&#xff0c;将其复制粘贴到项目images文件中&#xff0c;注意&#xff0c;图片的命名一定是数字形式&#xff0c;例如&#xff1a;1.jpg&#xff0c;风景图也是自行下载然后粘贴到相应的文件。 三 代码实现…

【Docker】添加指定用户到指定用户组

运行Docker ps命令&#xff0c;报错&#xff1a;/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied 创建docker用户组 安装docker时默认已经创建好 sudo groupadd docker添加用户加入docker用户组 此处以用户user为例 sudo usermo…

生意不好做?不妨去“私域”找找机会

站在2023年的尾巴上向前看&#xff0c;零售从业者们心里都有同样的疑问&#xff1a;2024年消费还能好么&#xff1f;增长的机会又在哪里&#xff1f; “我会说&#xff1a;要有信心&#xff0c;消费行业永远年轻。”经济学家香帅在企业微信举办的“2023实干企业家峰会消费专场…

六、从0开始卷出一个新项目瑞萨RZN2L之loader app分离工程优化

六、loader app分离工程 6.1 概述 6.2 官方资料与不足 6.3 loader app分离工程的优化 6.3.1 自动调节合并appsection 6.3.2 loader中使用外设 6.3.3 app使用sram mirror 6.3.4 sram atcm同时使用 六、从0开始卷出一个新项目之瑞萨RZN2L loader…

决心解开软光栅的心结

最近几天离职在家,是的,还没回老家.白天周中的时候写这个软光栅化渲染器.包括在上班的最后项目大家都不干活的时候我已经开始写了.到今天上午总算是有的看了.细节还差很多,下午把透视校正插值加上,下午加不完就元旦假期之后再说(元旦我要写pbrt的读书笔记).还有摄像机裁剪,背面…

【Vue2 + ElementUI】el-table中校验表单

一. 案例 校验金额 阐述&#xff1a;校验输入的金额是否正确。如下所示&#xff0c;点击【编辑图标】会变为input输入框当&#xff0c;输入金额。当输入框失去焦点时&#xff0c;若正确则调用接口更新金额且变为不可输入状态&#xff0c;否则返回不合法金额提示 <templat…

proE各版本安装指南

下载链接 https://pan.baidu.com/s/1BSaJxvPPGeIa4YKm7xk57g?pwd0531 1.鼠标右击【Proe5.0M280(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Proe5.0M280(64bit)】&#xff08;解压的路径中不能有中文&#xff09;。 2.打开…

BIT-666 的 2023 年度总结

<<< 年度总结 >>> <<< 年度数据 >>> ◆ 发博情况 ◆ 学习成就 ◆ 代码提交 ◆ 博文表现 <<< 年度创作 >>> ◆ LLM - LLaMA2 <<< 年度风景 >>> ◆ 春 - 中关村软件园 - 百望山 ◆ 夏 - 乌兰…

Gamma LUT PG285笔记

1 gamma校正应用背景 探测器响应为线性亮度或RGB值&#xff0c;而显示器并非线性&#xff0c;需要算法做校正。 2 reg 可以配置3张LUT表&#xff0c;每张表最大1024个16bit参数。表中0x0800仅是第一张表的起始地址&#xff0c;地址每次加4。 3 数据输入的格式 按照RBG的顺序…

springboot参数校验常用注解及分组校验

一、使用方式添加Validated 二、常见注解 Null 被注解的元素必须为null NotNull 被注解的元素必须不为null NotBlank 只能作用在接收的 String 类型上&#xff0c;注意是只能&#xff0c;不能为 null&#xff0c;而且调用 trim() 后&#xff0c;长度必须大于 0即&#xff…

Solana 与 DePIN 的双向奔赴,会带来 DePIN 之夏吗?

作者&#xff1a;LBank Labs 研究员 F.F 编译&#xff1a;TinTinLand 原文&#xff1a;https://medium.com/lbanklabs/new-anchor-of-solana-depin-b674d04d6980 太长不看版 在过去的一年里&#xff0c;我们观察到 Solana 和 DePIN 两者都呈现出了显著的增长。这不仅是极客科…

Ubuntu22.04-安装后Terminal无法调出

参考&#xff1a; Ubuntu20.04 终端打开不了的问题排查_ubuntu终端打不开-CSDN博客 https://blog.csdn.net/u010092716/article/details/130968032 Ubuntu修改locale从而修改语言环境_ubuntu locale-CSDN博客 https://blog.csdn.net/aa1209551258/article/details/81745394 问…

为什么ChatGPT采用SSE协议而不是Websocket?

在探索ChatGPT的使用过程中&#xff0c;我们发现GPT采用了流式数据返回的方式。理论上&#xff0c;这种情况可以通过全双工通信协议实现持久化连接&#xff0c;或者依赖于基于EventStream的事件流。然而&#xff0c;ChatGPT选择了后者&#xff0c;也就是本文即将深入探讨的SSE&…

私域营销新趋势:电商品牌如何打破传统,实现共赢?

一、自私的私域 私域运营已经成为企业营销的重要手段之一&#xff0c;越来越多的品牌开始重视私域的构建和运营。瑞幸咖啡、熊猫不走和泡泡玛特等品牌的成功案例证明了私域运营的重要性和价值。这些品牌通过建立自己的用户社区&#xff0c;提供个性化的服务和营销策略&#xf…

Zabbix“专家坐诊”第221期问答汇总

问题一 Q&#xff1a;使用官方docker模板Template App Docker&#xff0c;监控docker镜像&#xff0c;有一项监控项docker.data_usage有报错&#xff0c;不知道哪里问题&#xff1a;Cannot fetch data: Get “http://1.28/system/df”: context deadline exceeded (Client.Time…

WebGL技术的应用场景

WebGL&#xff08;Web Graphics Library&#xff09;是一种在Web浏览器中渲染3D图形的技术&#xff0c;它基于OpenGL ES&#xff08;OpenGL for Embedded Systems&#xff09;标准&#xff0c;允许通过JavaScript编写高性能的3D图形应用。以下是一些WebGL技术的应用场景&#x…

iptables防火墙——学会利用SNAT和DNAT 共享上网并发布内网服务器

本章展示&#xff1a; -- 学会利用SNAT策略共享上网 -- 学会利用DNAT策略发布内网服务器 -- 学会编写简单的防火墙脚本 3.1 SNAT 策略及应用 Linux 防火墙在很多时候承担着连接企业内、外网的重任&#xff0c;除了提供数据包过滤功能以 外&#xff0c;还提供一些基本的网关…

免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼

在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有原始工程文件的情况下&#xff0c;将其还原和分离是一件很有难度的事情。 言及背景音人声分离技术&#xff0c;就不能不提Spleeter&#xff0c;它是一种用…

基于springboot+vue协同过滤算法的电影推荐系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;摘 要 “互联网”的战略实施后&a…

根据commitID删除某一次提交

1.查看提交历史 git log --prettyoneline2.找到需要删除的那个commit,然后找到上次提交的commitID 比如想要删除下面这一条 我们找到上次提交的commitID 3.执行rebase git rebase -i efa11da0a684977bf8ac047ebb803e2ded2063a4 进入编辑状态显示如下 将需要删除的那个提交前…