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

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.hqwc.cn/news/97611.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js+vue,前端关于页面滚动让头部菜单淡入淡出实现原理

今天遇到个需求&#xff1a;我这里借用小米商城的详情页做个比喻吧。 刚开始其商品详情页是这样的&#xff1a; 当滚动到一定高度时&#xff0c;是这样的&#xff1a; 可以看到当滚动到轮播图底下的时候&#xff0c;详情页的菜单完全显现出来。 以下上代码&#xff1a; HTML…

从零开始探索C语言(三)----运算符和判断语句

文章目录 1. C 运算符1.1 算术运算符1.2 关系运算符1.3 逻辑运算符1.4 位运算符1.5 赋值运算符1.6 杂项运算符 ↦ sizeof & 三元1.7 C 中的运算符优先级 2. C 判断2.1 if 语句2.2 if...else 语句2.3 if...else if...else 语句2.4 ? : 运算符(三元运算符) 1. C 运算符 运算…

【深度学习】基于卷积神经网络的铁路信号灯识别方法

基于卷积神经网络的铁路信号灯识别方法 摘 要&#xff1a;1 引言2 卷积神经网络模型2.1 卷积神经网络结构2.2.1 卷积层2.2.2 池化层2.2.3 全连接层 3 卷积神经网络算法实现3.1 数据集制作3.2 卷积神经网络的训练过程3.2.1 前向传播过程 4 实验5 结语 摘 要&#xff1a; 目前中…

maven基础学习

什么是maven 构建 依赖 maven核心概念坐标 在黑窗口使用maven命令生成maven工程 pom.xml 想导入哪个jar包把它的坐标放到dependency里就可以 maven核心概念POM maven核心概念约定的目录结构 执行maven的构建命令 清理操作&#xff0c;clean 编译操作 compile 测试操作 test 打包…

openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构

文章目录 openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构 openGauss学习笔记-60 openGauss 数据库管理-逻辑存储结构 openGauss的数据库节点负责存储数据&#xff0c;其存储介质也是磁盘&#xff0c;本节主要从逻辑视角介绍数据库节点都有哪些对象&#xff0c;以及这…

SpringMvc入门

目录 1.什么是SpringMvc 2.SpringMVC工作流程 3.SpringMVC核心组件 4.SpringMvc入门 添加依赖 编写spring-mvc.xml 编写IndexController类 编写jsp 编写web.xml 测试结果 5.静态资源处理 编写Spring-mvc.xml 测试结果 ​编辑 1.什么是SpringMvc Spring MVC是一个…

1688采集商品主图,价格,规格接口

采集1688商品主图&#xff0c;价格接口&#xff0c;点击测试 在如今的电商时代&#xff0c;越来越多的人开始选择在1688平台上寻找商品&#xff0c;而采集软件的方式也有很多种&#xff0c;但是在市面上&#xff0c;各种采集软件琳琅满目&#xff0c;令人眼花缭乱&#xff0c;…

EXPLAIN概述与字段剖析

6. 分析查询语句&#xff1a;EXPLAIN(重点) 6.1 概述 定位了查询慢的sQL之后&#xff0c;我们就可以使用EXPLAIN或DESCRIBE 工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的&#xff0c;并且分析结果也是一样的。 MySQL中有专门负责优化SELECT语句…

ChatGPT数据分析及作图插件推荐-Code Interpreter

今天打开chatGPT时发现一个重磅更新&#xff01;code interpreter插件可以使用了。 去查看openai官网&#xff0c;发现从2023.7.6号&#xff08;前天&#xff09;开始&#xff0c;code interpreter插件已经面向所有chatGPT plus用户开放了。 为什么说code interpreter插件是一…

2023-9-4 最大公约数

题目链接&#xff1a;最大公约数 #include <iostream>using namespace std;int gcd(int a, int b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >> n;while(n--){int a, b;cin >> a >> b;cout << gcd(a, b) << endl;}return …

会话跟踪技术学习笔记(Cookie+Session)+ HTTP学习笔记

一、会话跟踪技术&#xff08;CookieSession&#xff09; 1.1 预备知识 1. 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 2. 会话跟踪&a…

2023 最新前端面试题 (HTML 篇)

1. src 和 href 的区别 src 用于替换当前元素&#xff08;引入&#xff09;&#xff0c;href 用于在当前文档和引用资源之间确立联系&#xff08;引用&#xff09; &#xff08;1&#xff09;src&#xff08;source&#xff09; 指向外部资源的位置&#xff0c;指向的内容将会嵌…