C++编程(八)多态

文章目录

  • 一、多态
    • (一)概念
      • 1. 多态
      • 2. 函数重写
      • 3. 虚函数
    • (二)实现多态的条件
      • 1. 继承关系
      • 2. 父类中写虚函数
      • 3. 在子类中重写父类的虚函数
      • 4.父类的指针或引用指向子类的对象
      • 5. 使用示例
    • (三)虚析构函数
    • (四)纯虚函数和抽象类

一、多态

(一)概念

1. 多态

多态是泛型编程的一种。
泛型编程是一种程序设计风格,它允许程序员在编写代码时使用以后才指定的类型,通过这种方式,可以编写出适用于多种数据类型的通用代码,从而提高代码的复用性和效率。

多态:通过调用一个公共成员函数产生不同的形态;

分类:
静态多态:在编译阶段就确定地址。如:函数重载,运算符重载
动态多态:在运行阶段确定地址

2. 函数重写

函数重写:在子类中重写父类的相同的函数,称之为函数重写。

函数重载:相同的作用域,相同的函数名,不同的形参表构成函数重载
函数重写:相同的函数名,相同的参数,相同的返回值,函数体可以不同。

  • 注:函数重写必须发生在基类和派生类之间;

3. 虚函数

C++在声明和定义函数的时候,在前面加上vittual关键字,就称为虚函数

(二)实现多态的条件

1. 继承关系

2. 父类中写虚函数

3. 在子类中重写父类的虚函数

在子类中重写父类的虚函数时,不加virtual关键字也是在重新虚函数;
也可以加上virtual,但是一般不加。

4.父类的指针或引用指向子类的对象

5. 使用示例

#include <iostream>
#include <string>using namespace std;class Hero{
protected:string name;int life=100;
public:Hero(){}Hero(string n,int l):name(n),life(l){}~Hero(){}virtual void reduce_life(){life--;}int get_life(){return life;}
};class Master:public Hero{
private:string skill;
public:Master():Hero(){}Master(string n,int l,string s):Hero(n,l),skill(s){}~Master(){}void reduce_life(){life-=500;}
};class Shooter:public Hero{
private:int attack;
public:Shooter():Hero(){}Shooter(string n,int l,int a):Hero(n,l),attack(a){}~Shooter(){}void reduce_life(){life-=300;}
};//全局函数
void fight_wild(Hero &h){ //相当于父类的引用指向了子类的对象h.reduce_life();
}int main()
{Master m("妲己",4000,"爱心攻击");Shooter s("鲁班七号",4500,300);fight_wild(m);fight_wild(s);cout<<"m.life="<<m.get_life()<<endl;cout<<"s.life="<<s.get_life()<<endl;return 0;
}

(三)虚析构函数

构造函数、拷贝构造函数和拷贝赋值函数不能实现虚函数
析构函数可以实现虚函数

(四)纯虚函数和抽象类

只有函数的声明,没有函数的定义的虚函数称之为纯虚函数。

纯虚函数的语法格式:

virtual void show(){}
virtual void show()=0;//花括号和函数体换成=0
  • 注:
  • 如果写成纯虚函数就必须在子类中进行重写父类的虚函数
  • 如果类中有纯虚函数则这个类称之为抽象类
  • 如果类中的成员函数全部都是纯虚函数则这个类称之为纯抽象类
#include <iostream>
#include <string>using namespace std;class Drink{
protected:
public:virtual void Boil()=0;virtual void Brew()=0;virtual void PourIncup()=0;virtual void PutSomthing()=0;void Drink_make(){Boil();Brew();PourIncup();PutSomthing();}
};class Coffee:public Drink{
private:
public:void Boil(){cout<<"烧水"<<endl;}void Brew(){cout<<"冲泡咖啡"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加糖和牛奶"<<endl;}
};class Tea:public Drink{
private:
public:void Boil(){cout<<"烧水"<<endl;}void Brew(){cout<<"冲泡茶叶"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加珍珠和奶"<<endl;}
};int main()
{Coffee c;Tea t;c.Drink_make();cout<<"**********"<<endl;t.Drink_make();return 0;
}

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

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

相关文章

springboot项目jar包修改数据库配置运行时异常

一、背景 我将软件成功打好jar包了&#xff0c;到部署的时候发现jar包中数据库配置写的有问题&#xff0c;不想再重新打包了&#xff0c;打算直接修改配置文件&#xff0c;结果修改配置后&#xff0c;再通过java -jar运行时就报错了。 二、问题描述 本地项目是springBoot项目…

【计算机图形学 | 基于MFC三维图形开发】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

Java中的持续集成与持续部署

Java中的持续集成与持续部署 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的持续集成&#xff08;Continuous Integration&#xff…

熟练掌握Docker及linux常用命令排查线上问题。熟悉Git, Maven等项目管理及构建工具,熟悉微服务中基于Jenkins的CI/CD

掌握Docker、Linux命令、项目管理及构建工具&#xff0c;以及CI/CD流程是现代软件开发和运维的关键技能。以下是对这些技能的概述和一些实践建议&#xff1a; ### Docker - **概述**&#xff1a;Docker是一个开源的容器化平台&#xff0c;允许开发者打包应用及其依赖到一个可移…

【Godot4.2】Godot中的贝塞尔曲线

概述 通过指定平面上的多个点&#xff0c;然后顺次连接&#xff0c;我们可以得到折线段&#xff0c;如果闭合图形&#xff0c;就可以获得多边形。通过向量旋转我们可以获得圆等特殊图形。 但是对于任意曲线&#xff0c;我们无法使用简单的方式来获取其顶点&#xff0c;好在计…

mac上使用finder时候,显示隐藏的文件或者文件夹

默认在finder中是不显示隐藏的文件和文件夹的&#xff0c;但是想创建.gitignore文件&#xff0c;并向里面写入内容&#xff0c;即便是打开xcode也是不显示这几个隐藏文件的&#xff0c;那有什么办法呢&#xff1f; 使用快捷键&#xff1a; 使用finder打开包含隐藏文件的文件夹…

Linux如何安装openjdk1.8

文章目录 Centosyum安装jdk和JRE配置全局环境变量验证ubuntu使用APT(适用于Ubuntu 16.04及以上版本)使用PPA(可选,适用于需要特定版本或旧版Ubuntu)Centos yum安装jdk和JRE yum install java-1.8.0-openjdk-devel.x86_64 安装后的目录 配置全局环境变量 vim /etc/pr…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)

1.摄像头模组 SC130GS通过一个引脚&#xff08;SPI_I2C_MODE&#xff09;选择使用IIC或SPI配置接口&#xff0c;通过查看摄像头模组的原理图&#xff0c;可知是使用IIC接口&#xff1b; 通过手册可知IIC设备地址通过一个引脚控制&#xff0c;查看摄像头模组的原理图&#xff…

中日区块链“大比拼”!中国蚂蚁加大区块链押注资本!日本索尼进军加密货币市场!

科技巨头在区块链和加密货币领域的动作越来越频繁。近期&#xff0c;中国金融科技巨头蚂蚁集团进一步加大了在区块链业务上的投资&#xff0c;而日本电子科技巨头索尼集团则正式进军加密货币交易领域。这些举措反映了两国对于区块链和加密资产领域的不同态度和布局。 蚂蚁集团加…

disql使用

进入bin目录&#xff1a;cd /opt/dmdbms/bin 启动disql&#xff1a;./disql&#xff0c;然后输入用户名、密码 sh文件直接使用disql&#xff1a; 临时添加路径到PATH环境变量&#xff1a;在当前会话中临时使用disql命令而无需每次都写完整路径&#xff0c;可以在执行脚本之前…

973. 最接近原点的 K 个点-k数组维护+二分查找

973. 最接近原点的 K 个点-k数组维护二分查找 给定一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点&#xff0c;并且是一个整数 k &#xff0c;返回离原点 (0,0) 最近的 k 个点。 这里&#xff0c;平面上两点之间的距离是 欧几里德距离&#…

洗衣机水龙头要买有止逆阀的,多花几十元能省掉几万,值了

问大家一下&#xff0c;你家洗衣机水龙头用的是什么样的&#xff1f;      可能有业主会说我家买的是纯铜的&#xff0c;质量挺好的。      如果你家选的洗衣机水龙头仅仅是纯铜的&#xff0c;并没有其他的功能&#xff0c;你还是选做错了。      因为洗衣机水龙头…

初学嵌入式是弄linux还是单片机?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;1、先入门了51先学了89c52…

leetcode每日一练:链表OJ题

链表经典算法OJ题 1.1 移除链表元素 题目要求&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&a…

学习java第一百一十八天

Component 和 Bean 的区别是什么&#xff1f;Component 注解作用于类&#xff0c;而Bean注解作用于方法。Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中&#xff08;我们可以使用 ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装…

Nacos 配置中心:动态加载 Bean

前提&#xff1a; 已经集成好 springboot / cloud 与nacos的环境 1 nacos中配置文件参数 message:#sender: emailMessageSendersender: smsMessageSender 2 接口和两个实现类 public interface MessageSender {String sendMessage(String message, String recipient); }impo…

模电-二极管及其应用51单片机LED点亮前置工作!

今日小记 2024-7-2&#xff0c;星期二&#xff0c;16:32&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。持续了两个星期的梅雨天终于暂时过去啦&#xff0c;迎来了久违的阳光&#xff0c;虽然没有雨天凉快&#xff0c;但是能看到太阳也是开心哒&#xff0c;心…

2021强网杯

一、环境 网上自己找 二、步骤 2.1抛出引题 在这个代码中我们反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

工业 web4.0UI 风格品质卓越

工业 web4.0UI 风格品质卓越

深入理解 RabbitMQ、RocketMQ等常⽤的消息中间件进⾏消息的异步数据处理

深入理解消息中间件对于构建高可用、高性能的分布式系统至关重要。以下是对RabbitMQ和RocketMQ这两种常用消息中间件的异步数据处理的深入理解&#xff1a; ### RabbitMQ RabbitMQ是一个开源的消息代理&#xff0c;它支持多种消息协议&#xff0c;如AMQP、STOMP等&#xff0c;…