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

news2024/11/18 1:34:17

静态多态 +动态多态

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

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

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

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

动态多态产生条件

1)先有继承关系

2)父类中有虚函数,子类重写父类虚函数

返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外)
子类中virtual关键字可写可不写,建议写

3)父类的指针或引用指向子类对象

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

动态多态 +虚函数 原理

原理

在这里插入图片描述

通过指针偏移调用虚函数

在这里插入图片描述

多态中的 类型转换

向上类型转换 +向下类型转换

在这里插入图片描述

重载 重定义 重写 (区分)

重载

同一作用域的同名函数

  1. 同一个作用域
  2. 参数个数,参数顺序,参数类型不同
  3. 和函数返回值,没有关系
  4. const 也可以作为重载条件 //do(const Teacher& t){} do(Teacher& t)
重定义

隐藏基类函数

  1. 有继承
  2. 子类(派生类)重新定义父类(基类)的同名成员(非virtual函数)
重写

覆盖基类虚函数

  1. 有继承
  2. 子类(派生类)重写父类(基类)的 virtual 函数
  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;
}

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

重载 重定义 重写 (案列)

class A{
public:
	//同一作用域下,func1函数重载
	void func1(){}
	void func1(int a){}
	void func1(int a,int b){}
	void func2(){}
	virtual void func3(){}
};

class B : public A{
public:
	//重定义基类的func2,隐藏了基类的func2方法
	void func2(){}
	//重写基类的func3函数,也可以覆盖基类func3
	virtual void func3(){}
};

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

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

相关文章

Android Studio 报错AAPT: error: resource android:attr/lStar not found.解决方法!

目录 前言 一、报错信息 二、解决方法 三、常见处理方法总结 四、更多资源 前言 在快速发展的科技领域中&#xff0c;移动应用开发已经成为了一个非常热门的领域。而作为开发Android应用的主要工具之一&#xff0c;Android Studio 提供了丰富的功能和工具来帮助开发者构建…

c语言和python区别哪个难,c语言和python区别大不大

大家好&#xff0c;给大家分享一下c语言和python区别主要用来写什么&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

【零基础入门TypeScript】TypeScript - 基本语法

目录 你的第一个 TypeScript 代码 编译并执行 TypeScript 程序 编译器标志 TypeScript 中的标识符 TypeScript ─ 关键字 空格和换行符 TypeScript 区分大小写 分号是可选的 TypeScript 中的注释 TypeScript 和面向对象 语法定义了一组编写程序的规则。每种语言规范都…

浏览器使用隧道代理HTTP:洞悉无界信息

在信息爆炸的时代&#xff0c;互联网已经成为获取信息的首选渠道。然而&#xff0c;在某些地区或情况下&#xff0c;访问某些网站可能会受到限制。这时&#xff0c;隧道代理HTTP便成为了一个重要的工具&#xff0c;帮助用户突破限制&#xff0c;洞悉无界信息。 一、隧道代理HT…

Nextjs打包类型检查报错ype error: Property ‘card_list‘ does not exist on type(已解决)

在Nextjs 中 在数组 map 的时候报错如下: 里面的数据类型是 data1 {cart_list:[]} 那么在 声明类型的时候 使用 data1:{card_list:any[]} export default function Card({authStates,data1,data2}:{authStates:boolean;data1:{card_list:any[]};data2:any[]}) {}) 这样就…

学到了!3步get微信自动回复

你是不是也有过这样的烦恼&#xff1a;因为忙碌或是消息太多&#xff0c;没能及时回复好友消息&#xff0c;尤其是在休息、节假日的时候。 今天就给大家种草一款能够让微信自动回复消息的神器——微信管理系统&#xff0c;让你再忙碌也能及时回复好友&#xff01;而且操作也不…

YOLOv8改进 | 检测头篇 | DynamicHead原论文一比一复现 (不同于网上版本,全网首发)

一、本文介绍 本文给大家带来的改进机制是DynamicHead(Dyhead),这个检测头由微软提出的一种名为“动态头”的新型检测头,用于统一尺度感知、空间感知和任务感知。网络上关于该检测头我查了一些有一些魔改的版本,但是我觉得其已经改变了该检测头的本质,因为往往一些细节上才…

互联网加竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

【性能测试】性能压测TPS上不去原因分析,13年老鸟总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试TPS上…

数据结构学习 jz42连续子数组最大和

关键词&#xff1a;动态规划 滚动数组 最长上升子序列 这道题比较简单&#xff0c;类似最长上升子序列&#xff0c;比最长上升子序列简单。 和最长上升子序列的区别&#xff1a;这道题因为是连续的&#xff0c;所以只用记录max就好了。最长上升子序列是不连续的&#xff0c;所…

【计算机毕业设计】SSM实现的在线农产品商城

项目介绍 本项目分为前后台&#xff0c;且有普通用户与管理员两种角色。 用户角色包含以下功能&#xff1a; 用户登录,查看首页,按分类查看商品,查看新闻资讯,查看关于我们,查看商品详情,加入购物车,查看我的订单,提交订单,添加收获地址,支付订单等功能。 管理员角色包含以…

TypeScript 之 interface 和 type 的区别

结论&#xff1a; 1、可以声明的数据类型 type 可以修饰任何类型 &#xff08;值类型和引用数据类型&#xff09; interface 只能修饰引用类型 &#xff08;对象、数组、函数&#xff09; //interface 声明对象属性 interface ins {a: string;b?: number; //可选项 }// int…

python主流开发工具排名,python最好用的开发工具

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python的开发工具软件有哪些&#xff0c;python主流开发工具排名&#xff0c;今天让我们一起来看看吧&#xff01; 对于程序员来说&#xff0c;除了日常争论世界上最好的语言是哪一门以外&#xff0c;哪款 IDE 是最好的…

羊大师讲解长期喝羊奶的女性,身体变化与福利

羊大师讲解长期喝羊奶的女性&#xff0c;身体变化与福利 羊奶作为天然健康食品一直备受关注&#xff0c;尤其对女性来说更是具有独特的身体效益。长期喝羊奶不仅可以改善女性的健康状况&#xff0c;还能带来一系列积极的身体变化。本文小编羊大师将为大家详细介绍长期饮用羊奶…

程序员必知!装饰模式的实战应用与案例分析

装饰模式是一种结构型设计模式&#xff0c;允许在不改变对象基础上动态添加职责或行为。举个咖啡店中咖啡定制的实际例子&#xff0c;顾客可选不同配料装饰咖啡&#xff0c;每个配料视作装饰器&#xff0c;装饰模式优点有动态扩展、灵活性和避免类爆炸&#xff0c;但可能增加系…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务&#xff0c;管理起来非常简单&#xff0c;但…

虎克:开发小程序要多少钱一个,非专业开发如何做自己的小程序

小程序开发费用主要取决于小程序的功能复杂度和开发周期。一般来说&#xff0c;小程序开发费用可以分为两类&#xff1a;模板开发和定制开发。 模板开发&#xff1a;模板开发是指使用现成的模板进行开发&#xff0c;价格相对较低&#xff0c;一般在几千元左右。优点是价格便宜&…

SpringSecurity-2.7中跨域问题

SpringSecurity-2.7中跨域问题 访问测试 起因 写这篇的起因是会了解到 SSM(CrosOrigin)解决跨域,但是会在加入SpringSecurity配置后,这个跨域解决方案就失效了,而/login这个请求上是无法添加这个注解或者通过配置(WebMvcConfig)去解决跨域,所以只能使用SpringSecurity提供的.c…

【接口自动化】写接口自动化case要注意的点!

可能有人会说&#xff0c;写接口的自动化CASE多简单了&#xff0c;写个参数发送请求完事了&#xff0c;还要注意啥&#xff1f; 没错&#xff0c;相比起UI自动化的case&#xff0c;你要去写各种定位器&#xff0c;接口自动化的case写起来确实容易多了。这也是接口自动化的一个…