C++多态案例-设计计算器类

news2025/1/4 19:45:27

1.前置知识点

多态是面向对象的三大特性之一
多态分为两类

  • 静态多态:函数重载运算符重载都属于静态多态,复用函数名
  • 动态多态:派生类虚函数实现运行时多态

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

  • 静态多态的函数地址早绑定-----编译阶段确定函数地址
  • 动态多态的函数地址晚绑定-----运行阶段确定函数地址

动态多态必须满足的条件

  1. 有继承关系
  2. 子类重写父类的虚函数

1.1多态使用:

父类指针或者引用指向子类对象

1.2 重写概念

重写:函数名 参数列表 函数返回值类型 完全一致

1.3 多态的好处

  • 1.组织结构清晰
  • 2.可读性比较强
  • 3.对于前期和后期的扩展和维护性比较高

1.4 测试案例

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

#include<iostream>
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
class Animal {

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

};


//猫类
class Cat :public Animal {
public:
	void speak()
	{
		cout << "猫在说话" << endl;
	}

};

//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{

	animal.speak();

}


void test01()
{
	Cat cat;
	doSpeak(cat);



}





//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{

	test01();


	system("pause");
	return 0;


}

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

#include<iostream>
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
class Animal {

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

};


//猫类
class Cat :public Animal {
public:
	void speak()
	{
		cout << "猫在说话" << endl;
	}

};

//执行说话的函数
//地址早绑定,在编译阶段就确定了函数地址
void doSpeak(Animal &animal)//Animal &animal=cat
{

	animal.speak();

}


void test01()
{
	Cat cat;
	doSpeak(cat);



}





//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
int main()
{

	test01();


	system("pause");
	return 0;


}

结果

在这里插入图片描述

2. 设计实现两个操作数进行运算的计算器类

案例描述:
分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类
多态的优点:

  • 代码组织结构清晰
  • 可读性强
  • 利于前期和后期的扩展以及维护

对比传统写法和使用多态

  • 在真实开发中,提倡开闭原则
  • 开闭原则:对扩展进行开放,对修改进行关闭

2.1传统写法

#include<iostream>
#include<string>
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
//	virtual void speak()
//	{
//	
//		cout << "动物在说话" << endl;
//	
//	}
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
//	virtual void speak()
//	{
//		cout << "猫在说话" << endl;
//	}
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
//	animal.speak();
//
//}
//
//
//void test01()
//{
//	Cat cat;
//	doSpeak(cat);
//
//
//
//}

//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高



//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator---不利于维护
class Calculator
{
	//实现两个操作数运算
public:
	int getResult(string opt)//传入操作符
	{

		if (opt == "+")
		{
			return m_Num1 + m_Num2;
		}

		else if (opt == "-")
		{
			return m_Num1 - m_Num2;

		}

		else if (opt == "*")
		{
			return m_Num1 * m_Num2;

		}

	}


	int  m_Num1;
	int  m_Num2;



};

//测试案例


void test01()
{
	//创建计算器对象
	Calculator c;
	c.m_Num1 = 10;
	c.m_Num2 = 20;

	cout << c.m_Num1 << "+" << c.m_Num2 <<"="<< c.getResult("+") << endl;


}


int main()
{
	test01();



	system("pause");
	return 0;


}

2.2 使用多态实现计算器类

#include<iostream>
#include<string>
using namespace std;

//子类可以转父类,父类不能转子类
//动物类
//class Animal {
//
//public:
//	virtual void speak()
//	{
//	
//		cout << "动物在说话" << endl;
//	
//	}
//
//};
//
//
猫类
//class Cat :public Animal {
//public:
//	virtual void speak()
//	{
//		cout << "猫在说话" << endl;
//	}
//
//};
//
执行说话的函数
地址早绑定,在编译阶段就确定了函数地址
//void doSpeak(Animal &animal)//Animal &animal=cat
//{
//
//	animal.speak();
//
//}
//
//
//void test01()
//{
//	Cat cat;
//	doSpeak(cat);
//
//
//
//}

//多态的好处
//1.组织结构清晰
//2.可读性比较强
//3.对于前期和后期的扩展和维护性比较高



//分别利用普通写法和多态技术实现计算器
//普通写法class Calculator
class Calculator
{
	//实现两个操作数运算
public:
	int getResult(string opt)//传入操作符
	{

		if (opt == "+")
		{
			return m_Num1 + m_Num2;
		}

		else if (opt == "-")
		{
			return m_Num1 - m_Num2;

		}

		else if (opt == "*")
		{
			return m_Num1 * m_Num2;

		}

		return -1;

	}


	int  m_Num1;
	int  m_Num2;



};

//测试案例

void test01()
{
	//创建计算器对象
	Calculator c;
	c.m_Num1 = 10;
	c.m_Num2 = 20;

	cout << c.m_Num1 << "+" << c.m_Num2 << "=" << c.getResult("+") << endl;


}


//利用多态实现计算器
//实现计算器抽象类
class AbstractCalculator {

public:
	int m_Num1;
	int m_Num2;

	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return 0;


	}


};


//设计加法计算器类
class AddCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 + m_Num2;


	}

};
//设计减法计算器类

class SubCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 - m_Num2;


	}

};


//设计乘法计算器类
class MultCalculator :public AbstractCalculator
{


public:
	virtual int getResult()//在父类虚函数中不实现任何功能
	{
		return m_Num1 * m_Num2;


	}

};



void test02()
{

	//多态使用条件
	//父类指针或者引用指向子类的对象


	//1.加法运算
	AbstractCalculator *ptr = new AddCalculator;//C++无参构造可以省略()
	ptr->m_Num1 = 10;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "+" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放堆区数据

	//2.减法运算
	ptr = new SubCalculator;
	ptr->m_Num1 = 10;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "-" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放数据
    
			  
	//3.乘法运算
	ptr = new  MultCalculator;
	ptr->m_Num1 = 100;
	ptr->m_Num2 = 200;

	cout << ptr->m_Num1 << "*" << ptr->m_Num2 << "=" << ptr->getResult() << endl;

	delete ptr;//释放数据


}

int main()
{
	//test01();
	test02();


	system("pause");
	return 0;


}

结果

在这里插入图片描述

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

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

相关文章

Navicat Premium 16.2.7 for Mac

Navicat Premium 16是一款功能强大的跨平台数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等等。它提供了丰富的数据库管理功能和工具&#xff0c;可以帮助开发人员和数据库管理员快速地创建、管理和维护数据库。 Nav…

采用第11代Intel®Core处理器的多网口嵌入式边缘计算平台

Intel Core™ 11th i7/i5/i3/Celeron 处理器 及 8GB DDR4 3200Mb/s 内存4 x GbE, 3 x USB 3.2 Gen2, 1 x USB2.0, 1 x HDMI 1.4, 1 x DP 1.4a, 4 x RS232/422/485可选的第二堆栈支持多达2 x iDoor扩展&#xff0c;用于扩展无线连接、工业现场总线或更多I/O紧凑型无风扇设计零电…

1.15 自实现GetProcAddress

在正常情况下&#xff0c;要想使用GetProcAddress函数&#xff0c;需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址&#xff0c;接着在调用GetProcAddress函数时传入模块基址以及模块中函数名即可动态获取到特定函数的内存地址&#xff0c;但在有时这个函…

做答题小程序前期需要准备哪些工作

做一个答题小程序前期需要做哪些准备工作呢&#xff1f; 第一、要有明确的答题活动规则需求&#xff0c;比如是想用个人答题形式、还是pk答题形式&#xff0c;每个模式具体的出题规则和得分规则&#xff0c;这些要计划清楚&#xff0c;让开发答题小程序的公司能够充分理解你的需…

vue3哪个数组方法在vue2上做了升级处理

在 Vue 3 中&#xff0c;v-for 指令的数组更新行为进行了升级处理。在 Vue 2 中&#xff0c;当使用 v-for 渲染数组时&#xff0c;如果对数组进行了以下操作&#xff0c;Vue 无法检测到变化&#xff1a; 直接通过索引修改数组元素&#xff0c;例如 arr[0] newValue修改数组的…

MySQL 存储引擎,你了解几个?

引言 MySQL是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持多种不同的数据库引擎。数据库引擎是用于存储、管理和检索数据的核心组件&#xff0c;它们直接影响着数据库的性能、可靠性和功能&#xff0c;接下来本文介绍下一些常见的MySQL数据…

华为云云服务器评测 | 从零开始:云耀云服务器L实例的全面使用解析指南

文章目录 一、前言二、云耀云服务器L实例要点介绍2.1 什么是云耀云服务器L实例2.1.1 浅析云耀云服务器L实例 2.2 云耀云服务器L实例的产品定位2.3 云耀云服务器L实例优势2.4 云耀云服务器L实例支持的镜像与应用场景2.5 云耀云服务器L实例与弹性云服务器&#xff08;ECS&#xf…

MySQL基础篇:掌握数据表操作的基础知识

表(table)是一种结构化的文件&#xff0c;可以用来存储特定类型的数据&#xff0c;如&#xff1a;学生信息&#xff0c;课程信息&#xff0c;都可以放到表中。另外表都有特定的名称&#xff0c;而且不能重复。表中具有几个概念&#xff1a;列、行、主键。 列叫做字段(Column),行…

C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码

1 文本格式 /// <summary> /// 改进的车站信息类 class /// 增加了 链表 需要的两个属性 Last Next /// </summary> public class StationAdvanced { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; ///…

无涯教程-JavaScript - CUBEVALUE函数

描述 CUBEVALUE函数从多维数据集返回一个聚合值。 语法 CUBEVALUE (connection, [member_expression1], [member_expression2], …)争论 Argument描述Required/OptionalconnectionThe name of the connection to the cube. - A text stringRequiredmember_expression 多维表…

ssm+vue网络教学平台源码和论文

ssmvue网络教学平台源码和论文117 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 社会的进步&#xff0c;教育行业发展迅速&#xff0c;人们对教育越来越重视&#xff0c;在当今网络普及的情况下&#x…

易记笔记-Ubuntu 下【netstat】指令全解

文章目录 - 显示所有网络连接- 只显示监听的网络连接- 只显示TCP连接- 只显示UDP连接- 显示PID&#xff08;进程ID&#xff09;和程序名称- 显示数字格式的IP地址和端口号- 显示路由表- 仅显示IPv4或IPv6连接- 显示多重广播功能群组组员名单- netstat在线帮助- netstat的替代工…

Coles 五个月内推出SAP S/4HANA 财务核心

Coles是澳大利亚领先的零售企业&#xff0c;在全国拥有2,500多家零售店。100多年来&#xff0c;这家超市一直致力于为每周在Coles购物的2100万顾客提供优质、有价值的服务。 从Wesfarmers西农集团分拆之前&#xff0c;Coles抓住机会在其正在进行的数字化转型战略中向前迈进了一…

QGIS学习3 - 安装与管理插件

QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等&#xff0c;直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…

智慧武装三维电子沙盘系统

一、概况 智慧武装三维电子沙盘是一种结合了智能技术和虚拟现实技术的沙盘模拟系统。它通过使用三维投影技术和交互式触控技术&#xff0c;将实际战场的地形、建筑物、人员等元素以虚拟的形式呈现在沙盘上。 智慧武装三维电子沙盘可以实时获取各种战场数据&#xff0c;并通过智…

快速切换本地node版本(超简单)

1.查看本地node版本 使用命令&#xff1a; node -v 2.找到你原来版本node所安装的位置 使用命令&#xff1a; where node 3.找到该路径下的node.exe 文件 可以看到 我对应路径下的 node.exe文件 4.到官网找到需要下载的node.exe版本并下载保存在本地 node.js官网下载exe地址…

STM32存储左右互搏 I2C总线读写FRAM MB85RC16

STM32存储左右互搏 I2C总线读写FRAM MB85RC16 在较低容量存储领域&#xff0c;除了EEPROM的使用&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于EEPROM, 同样是非易失性存储单元&#xff0c;FRAM支持更高的访问速度&#xff0c; 其主要优点为没有EEPROM持续写操作跨页…

支付宝商户池

随着社会的发展&#xff0c;第三方支付公司的规章制度越来越完善&#xff0c;支付产品的迭代更新速度也越来越快。华北、白条等贷款工具的出现使信用卡失去了大部分的市场份额。我还记得盛大一卡通、俊旺一卡通等流行的常用卡产品现在逐渐被在线微信支付宝产品所取代。 “支付…

深入浅出AXI协议(4)——猝发传输

一、前言 在之前的文章中&#xff0c;我们着重介绍了关于AXI4的握手协议它可以使得传输的双方都可以自如地控制传输的速率&#xff0c;我们主要介绍了握手协议出现的3种可能情况。然后对于AXI4交易通信的握手信号的关系做出了介绍&#xff1a;&#xff08;1&#xff09;在AXI4互…

软件产品登记测试

1. 服务流程 2. 服务内容 对功能性、易用性、可移植性三个特性、五个子特性进行测试。通过测试检测表明软件功能基本实现&#xff0c;运行基本稳定&#xff0c;操作方便&#xff0c;用户手册描述完整正确&#xff0c;是否达到软件产品登记测试规范的要求。 3. 周期 实施测试…