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

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

        

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

欢迎指正与分享,谢谢!

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

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

相关文章

【SpringBoot项目】Tomcat started on port(s): 8080 (http) with context path ‘‘

运行程序后出现下面的错误&#xff0c;并且在postman中无法获取到数据 在idea中的错误显示的如下 本人的原因是忘记在Controller中忘记写&#xff01;&#xff01;&#xff01;&#xff01; RestController 如果你不是以下原因可以参考下面的文章&#xff1a; Initializing S…

在VSCode中实现Rust编程调试指南

在 VS Code 中调试 Rust&#xff1a;终极指南 在本教程中&#xff0c;您将学习如何使用 VS Code 调试 Rust。可用于使用 VS Code 调试 Rust 的操作。设置 VS Code 来调试 Rust Rust因其易用性、安全性和高性能而继续保持其作为最受欢迎的编程语言的地位。随着 Rust 的流行&…

MySQL 的 crash-safe浅谈

MySql执行流程 MySQL作为当下最流行的开源关系型数据库&#xff0c;有一个很关键和基本的能力&#xff0c;就是必须能够保证数据不会丢。那么在这个能力背后&#xff0c;MySQL是如何设计才能保证不管在什么时间崩溃&#xff0c;恢复后都能保证数据不会丢呢&#xff1f;有哪些…

【期末课程设计】学生成绩管理系统

因其独特&#xff0c;因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c 2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h 前言&#xff1a; 学生成绩管理系统含教师…

基于PySceneDetect的视频场景变换侦测与处理

剪映中集成了一个智能镜头分割的功能,其实是基于python的三方库PySceneDetect来实现的,主要用于对视频进行分析,寻找场景切换或剪辑。 不过一个一个处理起来比较麻烦,这里介绍一个python的三方库实现自动化批量处理。 文章目录 PySceneDetect主要功能特征PySceneDetect的安…

[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 一.Captcha验证码功能引入 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能…

windows下搭建php开发环境

http://wed.xjx100.cn/news/139397.html?actiononClick https://www.bilibili.com/read/cv23429835/ https://www.php.cn/faq/498307.html 安装iis 选择卸载程序 安装php 官网https://www.php.net/下载 选择线程安全 国内地址 下载完成后解压放到想存放的路径 添加p…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…

VUE3 语法教程

vue3 起步 刚开始学习 Vue&#xff0c;我们不推荐使用 vue-cli 命令行工具来创建项目&#xff0c;更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建的&#xff0c;语法格式如下&#xff1a; const app Vue.crea…

【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录 415. 字符串相加&#xff08;高精度计算、大数运算&#xff09;1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐解法1——按区间长度排序 离线询问 并查集解法2——离线算法 优先队列 874. 模拟行走机器人&#xff08;哈希表 方向数组&#xff09;918. 环形子数组的最大和…

ts中setState的类型

两种方法: 例子: 父组件 const [value, setValue] useState(); <ChildsetValue{setValue} />子组件 interface Ipros {setValue: (value: string) > void } const Child: React.FC<Ipros> (props) > {}

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

Linux QT通过NFS挂载到Linux开发板上

Linux QT通过NFS挂载到Linux开发板上 说明&#xff1a;这里使用的Linux开发板是正点原子的阿尔法开发板 创建NFS 环境 NFS简介 网络文件系统&#xff0c;英文 Network File System(NFS)&#xff0c;是由 SUN 公司研制的 UNIX 表示层协议 (presentation layer protocol)&…

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

【JavaEE】Spring中注解的方式去存储Bean对象

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结&#xff08;2&#xff09;1. 通过类注解的方式存储Bean对象1.1 五大 类注解1.1.1 Controller 控制器存储1.1.2 Service 服务存储1.1.3 Repository 仓库存储1.1.4 Component 组件存储1.1.5 Configuration 配置存储…

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

Ubuntu linux安装搜狗输入法

效果图&#xff1a; 一、首先要卸载掉自带的输入法 1、以root 身份登录系统并打开终端输入&#xff1a; apt-get remove ibus-pinyin 2、如果卸载后还需要使用&#xff0c;可通过如下方法安装 以root 身份登录系统并打开终端输入&#xff1a; apt-get install ibus-pinyin …

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

^(按位异或)操作符详解

因为未知&#xff0c;所以全力以赴 目录 例1.实现两个数的交换 例2.找出单身狗 1.简单版 2.进阶版 大家好&#xff0c;我是纪宁。这篇博客介绍^操作符及使用案例。 位操作符是对操作数的二进制补码进行操作。^就是位操作符的一种&#xff0c;叫按位异或操作符。计算结果是…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 上节课我们说过了&#xff0c;有一些网站比较痛恨爬虫程序&#xff0c;它们不喜欢被程序所访问&#xff0c;所以它们会检查链接的来源&#xff0c;如果说来源不是正…