动态多态的注意事项

大家好:

        衷心希望各位点赞。

        您的问题请留在评论区,我会及时回答。

多态的基本概念

多态是C++面向对象三大特性之一(多态、继承、封装)

多态分为两类:

静态多态:函数重载和运算符重载属于静态多态,复用函数名。

动态多态:通过派生类和虚函数实现运行时多态。

静态多态和动态多态的区别:

静态多态的函数地址早绑定——编译阶段确定函数地址。

动态多态的函数地址晚绑定——运行阶段确定函数地址。

下面通过案例讲解多态:

#include <iostream>
#include <Windows.h>

using namespace std;

class Animal
{
public:
	void speak()
	{
		cout << "动物在说话" << endl;
	}
};

class Cat : public Animal
{
public:

	// 重写父类中的函数
	void speak()
	{
		cout << "小猫在说话" << endl;
	}
};

// 执行说话的函数
void doSpeak(Animal& animal)
{
	animal.speak();
}


int main(void)
{
	Cat cat;
	doSpeak(cat); // 父类引用接收子类对象
	

	system("pause");
	return 0;
}

运行截图:

        全局函数doSpeak()在编译阶段就确定了它的地址——函数地址早绑定,即使形参传入基类Animal的任何子类,子类已经重写了基类的speak()函数。doSpeak() 函数只会调用基类Animal的speak()函数。但是,我们想执行这行代码doSpeak(cat)的时候,输出“小猫在说话”。即:在运行阶段,根据函数doSpeak()传入的实参类型,再去决定具体执行哪个类的成员函数。

        如果想要实现“小猫在说话”,那么函数地址就不能早绑定,必须在程序运行阶段进行绑定,即:动态多态的函数地址晚绑定——运行阶段确定函数地址。

        在父类的成员函数前加上关键字 virtual ,使其变成虚函数,并且在子类中重写父类的虚函数即可。

#include <iostream>
#include <Windows.h>

using namespace std;

class Animal
{
public:
	virtual void speak() // 虚函数
	{
		cout << "动物在说话" << endl;
	}
};

class Cat : public Animal
{
public:

	// 重写父类中的虚函数
	virtual void speak()
	{
		cout << "小猫在说话" << endl;
	}
};

class Dog : public Animal
{
	// 重写父类中的虚函数
	virtual void speak()
	{
		cout << "小狗在说话" << endl;
	}
};

// 执行说话的函数
void doSpeak(Animal& animal)
{
	// 在运行阶段,才能确定函数speak()的地址,即:根据实参类型,才能确定执行哪个speak()函数
	animal.speak(); 
}


int main(void)
{
	Cat cat;
	doSpeak(cat); // 调用类Cat的speak()

	cout << "----------" << endl;

	Dog dog;
	doSpeak(dog); // 调用类Dog的speak()
	

	system("pause");
	return 0;
}

运行截图:

         实现了:在程序运行时,根据实参类型,决定执行哪一个子类重写的函数。程序执行到doSpeak(cat)这行代码时,编译器检测到实参类型是Cat类,就会调用Cat类的speak()函数。程序执行到doSpeak(dog)这行代码时,编译器检测到实参类型是Dog类,就会调用Dog类的speak()函数。

        注意:子类重写父类的虚函数,可以省略 virtual 关键字。

总结

动态满足条件:

1、有继承关系

2、子类重写父类的虚函数

函数重写:函数首部完全相同,函数体不同,函数重写发生在子类中。

动态多态的使用

父类的指针或引用接收子类对象,调用子类重写的父类函数,就会发生动态多态。

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

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

相关文章

程序员35岁会失业吗?这事儿其实没那么简单!

35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经验和深厚的技术积累是年轻程序员无…

基于WTVXXX-32SS智能门锁后板锁方案

一&#xff1a;简介 随着用户认知和生活习惯的改变&#xff0c;消费者对构建便捷生活和智能家居系统的诉求持续增多&#xff0c;智能门锁作为智能家居的门面和典型的物理级入口&#xff0c;成为打造全屋智能必不可少的环节。随着智能门锁行业规模的不断提升&#xff0c;产品的生…

2024南京人工智能展会:定于2024年11月份在南京国际博览中心举行

2024南京国际人工智能展览会&#xff0c;拟定于2024年11月份在南京国际博览中心隆重召开。这一盛大的科技盛宴&#xff0c;无疑将为全球人工智能领域注入新的活力&#xff0c;推动科技创新与社会进步。 此次展览会将以“智能未来&#xff0c;共创辉煌”为主题&#xff0c;汇聚全…

IDEA中快速配置Git

Git介绍&#xff1a; Git下载 idea中配置Git

淘宝app商品数据API接口|item_get_app-获得淘宝app商品详情原数据

获得淘宝app商品详情原数据 API返回值说明 item_get_app-获得淘宝app商品详情原数据 公共参数​​​​​​ 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

低代码开发平台开源:提升效率,轻而易举!

当前&#xff0c;数字化转型与社会高速发展都是人们肉眼可见的发展趋势。作为中小企业&#xff0c;如何在激烈的市场竞争中脱颖而出&#xff1f;如何赢得话语权和主动权&#xff0c;从而提升市场竞争力&#xff1f;这就需要考虑引进更为先进和专业的办公利器了。低代码开发平台…

【Java程序设计】【C00379】基于(JavaWeb)Springboot的旅游服务平台(有论文)

【C00379】基于&#xff08;JavaWeb&#xff09;Springboot的旅游服务平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c…

网游版五子棋

五子棋游戏属于开房间类休闲游戏。可以非常方便实现分布式战斗服横向拓展&#xff0c;只要感觉服务器有压力&#xff0c;可以通过动态加战斗服服务器来实现。本文介绍一个基于jforgame组件开发的五子棋网络小游戏&#xff0c;支持分布式部署战斗服。 1.通信组件 浏览器&#…

python IDLE shell 编辑多行代码

1 打开软件 2创建python文本编辑 创建项目 点击File显示如图 再点击New File 将会弹出文本编辑区域 编辑多行代码 def greet(name):print("Hello, " name "!")greet("World")保存 点击File 再点击 Save 即可保存 &#xff08;或…

【动态规划】【数学方法】Leetcode 343. 整数拆分

【动态规划】【数学方法】Leetcode 343. 整数拆分 解法 动态规划解法 数学 每次拆成n个3&#xff0c;如果剩下是4&#xff0c;则保留4&#xff0c;然后相乘 ---------------&#x1f388;&#x1f388;343. 整数拆分 题目链接&#x1f388;&#x1f388;------------------- …

创建多节点 k8s 集群

主机IP系统master192.168.2.15ubuntu20.04 x64 2C 4GWorker1192.168.2.16ubuntu20.04 x64 2C 4GWorker1192.168.2.18ubuntu20.04 x64 2C 4G 使用 iterm2 连接四台服务器 command shift i 同时操作 初始化配置 关闭防火墙 systemctl stop firewalld systemctl disable firewa…

【学习】软件测试中,我们如何有效地跟踪和管理缺陷?

在软件测试中&#xff0c;如何有效地跟踪和管理缺陷&#xff1f;别急&#xff0c;一起来看下小编今日带来的分享。 1.缺陷报告 建立一个缺陷报告系统&#xff0c;让用户和团队成员能够提交缺陷报告。确保缺陷报告中包括清晰的问题描述、重现步骤、预期结果和实际结果等信息。2…

数组的概述

数组的概述 为什么需要数组 需求分析1&#xff1a; 需要统计某公司50个员工的工资情况&#xff0c;例如计算平均工资、找到最高工资等。用之前知识&#xff0c;首先需要声明50个变量来分别记录每位员工的工资&#xff0c;这样会很麻烦。因此我们可以将所有的数据全部存储到一…

java使用阿里巴巴oss

一 .准备 进入阿里 进入控制台 创建bucket 新建目录 点击AccessKey管理 创建AccessKey并复制下载key值 二.使用 导入阿里巴巴和spring依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version&…

进程管理命令

进程的概念 进程:运行中的程序(过程,动态) 程序:存储在磁盘上的二进制可执行文件;(静态) 操作系统是通过管理进程,让进程运行来完成用户的任务的; PCB:进程控制块,记录的是进程的相关属性信息;PID:是操作系统对进程的标识;唯一的; 简而言之, 程序:指令数据; 进程:运行中的程序…

Linux:进程概念认识

进程 基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08; CPU 时间&#xff0c;内存&#xff09;的实体。 描述进程 -PCB 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为…

前端必会的一些基础

1、如何把obj对象 添加到arr数组对象内 2、手机号、邮箱、隐藏用户手机号中间四位正则 3、两个数组 数组a未全部人员 数组b为已选中人员 默认选中 4、数组去重、 5、localStorage 存取 数组 方法 6、数据filter过滤 7、请求接口时header 请求格式不对 需要怎么转换&#xf…

缺省和重载——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…

C++运算符重载中的引用返回

文章目录 引言原因1.为了支持链式调用2.避免不必要的对象创建和复制3.保持语义一致性 引言 在C编程语言中&#xff0c;运算符重载是一项强大的特性&#xff0c;它允许程序员为自定义类型重新定义或重载已有的运算符&#xff0c;从而使得这些类型能够像内置类型一样使用运算符。…

数学建模之MATLAB使用

1.数值计算和符号计算的认识 我们都知道MATLAB里面存在着数值计算和符号计算&#xff0c;但是两者之间到底是怎样的呢&#xff1f; 举一个很简单的例子&#xff0c;我们在高等数学里面的微积分学习时经常求不定积分&#xff0c;也就是原函数&#xff0c;这个过程实际上进行的…