【C++】多态案例— —计算器类

news2024/11/25 19:40:15

author:&Calton

tag:C++

topic:【C++】多态案例— —计算器类

website:黑马程序员C++

date:2023年7月23日


目录

多态概要

案例实现

原理剖析


多态概要

        多态是C++三大特性之一(封装、继承、多态),分为静态多态(函数、运算符重载)和动态多态(派生类和虚函数运行时多态)

       多态语法:

         ①父类成员函数加上关键字virtual修饰为虚函数,子类继承并重写该函数(返回值、函数名、参数都相同)
        ②用父类指针定义或引用子类对象

        多态的优点:

        ①结构清晰

        ②便于维护和修改

        ③方便扩展而不修改主体

案例实现

源代码:

#include <iostream>
using namespace std;

/*
多态使用语法:
①父类成员函数加上关键字virtual修饰为虚函数,子类继承并重写该函数(返回值、函数名、参数都相同)
②用父类指针定义或引用子类对象
*/

//抽象计算器
class AbstractCalculator
{
public:
	int m_a;
	int m_b;
	virtual int calculate(AbstractCalculator& Caculator)	//虚函数,为多态做准备
	{
		return 0;
	}
};

//加法计算器
class AddCalculator:public AbstractCalculator
{
public:
	int calculate(AbstractCalculator &Caculator)		//重写父类函数
	{
		return m_a + m_b;
	}
};

//减法计算器
class SubCalculator :public AbstractCalculator
{
public:
	int calculate(AbstractCalculator& Caculator)		//重写父类函数
	{
		return m_a - m_b;
	}
};

//乘法计算器
class MulCalculator :public AbstractCalculator
{
public:
	int calculate(AbstractCalculator& Caculator)		//重写父类函数
	{
		return m_a * m_b;
	}
};

//除法计算器
class DivCalculator :public AbstractCalculator
{
public:
	int calculate(AbstractCalculator& Caculator)		//重写父类函数
	{
		return m_a / m_b;
	}
};

//加法运算
void test01()
{
	AddCalculator c1;	//定义子类对象
	c1.m_a = 10;
	c1.m_b = 10;
	cout << c1.m_a << "+" << c1.m_b << "=" << c1.calculate(c1) << endl;		//调用的calculate函数要求传入父类对象,但传入的是子类,即用父类指针定义或引用子类对象
}

/*
如果使用指针: AbstractCalculator* c1 = new AddCalculator;
函数不用参数,直接调用c1.calculate
*/
//减法运算
void test02()
{
	SubCalculator c1;
	c1.m_a = 10;
	c1.m_b = 10;
	cout << c1.m_a << "-" << c1.m_b << "=" << c1.calculate(c1) << endl;		//用父类指针定义或引用子类对象
}

//乘法运算
void test03()
{
	MulCalculator c1;
	c1.m_a = 10;
	c1.m_b = 10;
	cout << c1.m_a << "*" << c1.m_b << "=" << c1.calculate(c1) << endl;	//用父类指针定义或引用子类对象
}

//除法运算
void test04()
{
	DivCalculator c1;
	c1.m_a = 10;
	c1.m_b = 10;
	cout << c1.m_a << "/" << c1.m_b << "=" << c1.calculate(c1) << endl;	//用父类指针定义或引用子类对象
}

int main()
{
	test01();
	test02();
	test03();
	test04();
	return 0;
}

 

运行结果:

原理剖析

        父类AbstractCalculator内部结构

 

       virtual修饰前:

        

        virtual修饰后:

        

 

        子类AddCalculator内部结构

        

 

vfptr : virtual function pointer        虚函数指针

vftable : virtual function table        虚函数表

        父类使用virtual关键词修饰,使用虚函数后内部结构多了一个虚函数指针,使得地址晚绑定,运行阶段确定函数地址(根据子类对象相应地指向该子类的成员重写函数) 

        

        此例讲得不是特别好用于解释虚函数指针的作用和体现区别,因为受到同名函数子类成员函数覆盖父类的问题,读者可以另外设计程序实现。

欢迎指正与分享,谢谢!

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

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

相关文章

FreeRTOS源码分析-5 系统延时详解

目录 1 系统延时API详解 2 相对延时与绝对延时的区别 3 相对延时与绝对延时的应用 4 系统延时函数实现原理 4.1 vTaskDelay业务流程 4.2 vTaskDelayUntil业务流程 5 任务挂起/任务恢复详解 1 系统延时API详解 TickType_t 实际上是uint32_t类型 2 相对延时与绝对延时的区…

MATLAB | 绘制scatter散点图时如何自动标注超范围散点?

本文来讲一下如何自动标注超出坐标区域范围的点&#xff0c;例如这样&#xff1a; 如图右侧的红叉代表横坐标超过范围的点的纵坐标 &#xff0c;当然下方的红叉代表纵坐标超过范围点的横坐标。 本文使用的自己编写的工具函数scatterOOR将被放在文末&#xff0c;先讲讲咋用哈&a…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

Packet Tracer – 实施静态 NAT 和动态 NAT

Packet Tracer – 实施静态 NAT 和动态 NAT 拓扑图 目标 第 1 部分&#xff1a;利用 PAT 配置动态 NAT 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;验证 NAT 实施 第 1 部分&#xff1a; 利用 PAT 配置动态 NAT 步骤 1&#xff1a; 配置允许用于 NAT …

transformer 笔记

目录 目前在NLP领域当中&#xff0c;主要存在三种特征处理器——CNN、RNN 以及 Transformer&#xff0c;当前Transformer的流行程度已经大过CNN和RNN&#xff0c;它抛弃了传统CNN和RNN神经网络&#xff0c;整个网络结构完全由Attention机制以及前馈神经网络组成。 Transformer…

K8s Service网络详解(二)

Kube Proxy Kubernetes 在设计之初就充分考虑了针对容器的服务发现与负载均衡机制。 Service 资源&#xff0c;可以通过 kube-proxy 配合 cloud provider 来适应不同的应用场景。 Service相关的事情都由Node节点上的 kube-proxy处理。在Service创建时Kubernetes会分配IP给Ser…

Flask 定制日志并输出到文件

Flask 定制日志并输出到文件 定制日志器flask缺省日志器配置自定义日志器 定制日志器 flask缺省日志器配置 flask自带的日志系统&#xff0c;缺省配置dictConfig()&#xff0c;但必须在Flask()应用之前使用 # flask缺省配置 from logging.config import dictConfig dictConfig…

Spring MVC-基础概念(定义+创建和连接+@RequestMappring的描述)

目录 1.什么是Spring MVC&#xff1f; 2. MVC 和 Spring MVC 的关系 3.Spring MVC 项目创建 4. RequestMappring实现用户和程序的映射 4.1 RequestMappring 注解解释 4.2 方法1: RequestMapping(“/xxx”) 4.4 RequestMapping(method xxxx, value “xxx”) 是POST/GET…

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

你是否还在为工厂设备信息采集困难而烦恼&#xff1f;捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题&#xff01; 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计&#xff0c;可以用于欧姆龙多个系列PLC的太网数据采集&#xff0c;非常方便构建生…

请用Typescript写出20个数组方法的声明

前言 前段时间看直播看到狼叔直播驳斥”前端已死论“&#xff0c;前端死没死不知道&#xff0c;反正前端是拿不到以前那么多工资了&#xff1b;好&#xff0c;进入正题&#xff0c;狼叔在直播间提到要求前端写出20个数组上的方法&#xff0c;这确实不太简单&#xff0c;但是只…

【CSharp】关于xxx.csproj文件的理解

【CSharp】关于xxx.csproj文件的理解 1、背景2 关于.csproj 文件 1、背景 CShape又简写C#。 在示例代码里&#xff0c;遇到.csproj 文件。 项目结构如下&#xff1a; 本博客属于小白入门级。 2 关于.csproj 文件 上面的iRayBase.csproj 文件后缀是 .csproj 。 csproj的全称…

框架漏洞-CVE复现-Apache Shiro+Apache Solr

什么是框架&#xff1f; 就是别人写好包装起来的一套工具&#xff0c;把你原先必须要写的&#xff0c;必须要做的一些复杂的东西都写好了放在那里&#xff0c;你只要调用他的方法&#xff0c;就可以实现一些本来要费好大劲的功能。 如果网站的功能是采用框架开发的&#xff0c;…

typescript自动编译文件实时更新

npm install -g typescripttsc --init 生成tsconfig.json配置文件 tsc -w 在监听模式下运行&#xff0c;当文件发生改变的时候自动编译

【数学建模快速入门】

MD5码 生成了MD5码之后就不可以再去碰文件了&#xff08;打开都不行&#xff09;百度搜索 1、查询词的外边加上双引号“” 2、在查询词的前面加上&#xff1a;intitle: 3、查询词后面加上空格再输入filetype&#xff1a;文件格式&#xff08;doc/pdf/xls&#xff09; 4、在3的…

React+Redux 数据存储持久化

ReactRedux 数据存储持久化 1、安装相关依赖 yarn add reduxjs/toolkit redux redux-persist 2、userSlice&#xff1a;用户状态数据切片封装 import { createSlice, PayloadAction } from reduxjs/toolkitinterface IUserInfo {userName: stringavatar?: stringbrief?: st…

第111天:免杀对抗-JavaASM汇编CS调用内联CMSF源码特征修改Jar打包

知识点 #知识点&#xff1a; 1、ASM-CS-单汇编&内联C 2、JAVA-MSF-源码修改&打包#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载面-Dll反射…

基于linux下的高并发服务器开发(第三章)- 3.6 线程取消

#include <pthread.h> int pthread_cancel(pthread_t thread);- 功能&#xff1a;取消线程&#xff08;让线程终止&#xff09;取消某个线程&#xff0c;可以终止某个线程的运行&#xff0c;但是并不是立马终止&#xff0c;而是当子线程执行到一个取消点&#xff0c;线程…

GOT Online|解密游戏性能优化秘籍

随着UWA GOT Online功能的不断迭代&#xff0c;GOT Online为解决各种游戏性能问题&#xff08;如内存占用、CPU耗时、GPU耗时和卡顿&#xff09;提供了丰富的高效、准确且便捷的数据获取方式和分析建议。本文总结了GOT Online&#xff08;SDK 2.4.7版本&#xff09;中的关键优化…

fps php,帧率60帧是什么意思

帧率60的意思是每秒屏幕刷新60次&#xff0c;帧率是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数即Frames per Second&#xff0c;简称FPS或“赫兹”&#xff0c;此词多用于影视制作和电子游戏。 本文操作环境&#xff1a;Windows7系统&#xff0c;Dell G3电脑。 帧…

计算机网络模型

计算机网络模型 网络模型网络模型中各层对应的协议封装与分用TCP/IP协议簇的组成 网络模型 OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP四层模型 应用层、传输层、网络层、网络接口层 TCP/IP五层模型 应用层、传输层、网络层、数据链路…