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.mfbz.cn/a/765319.html

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

相关文章

数组-移除元素

移除元素 移除元素&#xff08;leetcode27&#xff09; var removeElement function(nums, val) {const n nums.length;let left 0;for (let right 0; right < n; right) {if (nums[right] ! val) {nums[left] nums[right];left;}}return left; };删除有序数组中的重复…

236、二叉树的最近公共祖先

前提&#xff1a; 所有 Node.val 互不相同 。p ! qp 和 q 均存在于给定的二叉树中。 代码如下&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root q || root p || root NULL) return root;TreeN…

代码随想录第41天|动态规划

322. 零钱兑换 dp[j] : 最小硬币数量, j 为金额(相当于背包空间)递推公式 : dp[j] min(dp[j - coins[i]] 1, dp[j])初始化: 需要一个最大值, 避免覆盖, dp[0] 0遍历顺序: 钱币有序无序不影响, 因为求解最小个数, 结果相同(先遍历物品后背包, 先背包后物品都可) class Solut…

构造,析构,拷贝【类和对象(中)】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…

Linux高并发服务器开发(九)Tcp状态转移和IO多路复用

文章目录 0 包裹函数1 多进程服务器流程代码 2 多线程服务器3 TCP状态转移半关闭心跳包 4 端口复用5 IO多路复用技术高并发服务器 6 select代码总结 7 POLLAPI代码poll相对select的优缺点 8 epoll&#xff08;重点&#xff09;API监听管道代码EPOLL 高并发服务器 9 Epoll的两种…

真的假不了,假的真不了

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 最近&#xff0c;17岁的中专生姜萍参加阿里巴巴 2024 年的全球数学竞赛&#xff0c;取得了 12 名的好成绩&#xff0c;一时间在网上沸腾不止。 从最开始的“数学天才”&#xff0c;到被质疑&#xff…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【动态规划 前缀和】2478. 完美分割的方案数

本文涉及知识点 划分型dp 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2478. 完美分割的方案数 给你一个字符串 s &#xff0c;每个字符是数字 ‘1’ 到 ‘9’ &#xff0c;再给你两个整数 k 和 minLength 。 如…

A股站不稳3000点让人稀罕不已啊

今天的A股&#xff0c;让人稀罕不已&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市冲了下3000点&#xff0c;第一个主题炒作的热点终于出现了&#xff0c;税改方向的行情发酵&#xff0c;并带动着其他改革相关方…

某某市信息科技学业水平测试软件打开加载失败逆向分析(笔记)

引言&#xff1a;笔者在工作过程中&#xff0c;用户上报某某市信息科技学业水平测试软件在云电脑上打开初始化的情况下出现了加载和绑定机器失败的问题。一般情况下&#xff0c;在实体机上用户进行登录后&#xff0c;用户的账号信息跟主机的机器码进行绑定然后保存到配置文件&a…

时间复利效应才是人生的催化剂

在追求成功的道路上&#xff0c;许多人都在寻找捷径。然而&#xff0c;真正的捷径并非不劳而获的幻想&#xff0c;而是通过长期坚持在某一领域深耕细作&#xff0c;享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去&#xff0c;以实现成功。 时间…

作业7.2

用结构体数组以及函数完成: 录入你要增加的几个学生&#xff0c;之后输出所有的学生信息 删除你要删除的第几个学生&#xff0c;并打印所有的学生信息 修改你要修改的第几个学生&#xff0c;并打印所有的学生信息 查找你要查找的第几个学生&#xff0c;并打印该的学生信息 1 /*…

经典的卷积神经网络模型 - ResNet

经典的卷积神经网络模型 - ResNet flyfish 2015年&#xff0c;何恺明&#xff08;Kaiming He&#xff09;等人在论文《Deep Residual Learning for Image Recognition》中提出了ResNet&#xff08;Residual Network&#xff0c;残差网络&#xff09;。在当时&#xff0c;随着…

搜狐新闻HarmonyOS版本 push 推送开发

背景 搜狐新闻作为HarmonyOS的合作伙伴&#xff0c;于2023年12月成功上架鸿蒙单框架应用市场&#xff0c;成为首批鸿蒙应用矩阵的一员。 新闻类推送作为应用的重要组成部分&#xff0c;在二期规划中&#xff0c;我们将推送功能列为核心功能模块。本文将推送集成过程中的步骤和…

360的chromesafe64.dll动态链接库导致chrome和edge浏览器闪退崩溃关闭

在chrome或edge浏览器中打开特定的一些网页会导致浏览器闪退关闭 这是windows系统记录的报错日志 chrome报错日志 edge报错日志 日志指向的就是chromesafe64.dll这个动态库 然后用everything搜索发现原来在360安装目录下 360安装目录下的chromesafe64.dll文件 为什么360中的…

NSSCTF-Web题目21(文件上传-phar协议、RCE-空格绕过)

目录 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 3、思路 [FSCTF 2023]细狗2.0 4、题目 5、知识点 6、思路 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 文件上传&#xff0c;phar伪协议 3、思路 点击upload&#xff0c;看看 这里提示我们可以上传图片或压缩包&…

【CSAPP】-binarybomb实验

目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 操作异常问题与解决方案 实验总结 实验目的与要求 1. 增强学生对于程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 2. 掌握使用gdb调试器…

生命在于学习——Python人工智能原理(3.1.2)

一、概率基本知识 1.3 常见概型 1.3.1 古典概型 定义1 古典概型 若随机事件E满足如下两个条件&#xff1a; &#xff08;1&#xff09;样本空间S中只有有限个样本点。 &#xff08;2&#xff09;样本空间S中每个样本点发生都是等可能的。 这样的随机试验称为古典概型。 P(A)…

JavaMySQL 学习(基础)

目录 Java CMD Java发展 计算机存储规则 Java学习 switch新用法&#xff08;可以当做if来使用&#xff09; 数组定义 随机数 Java内存分配 MySQL MySQL概述 启动和停止 客户端连接 数据模型 关系型数据库 SQL SQL通用语法 SQL分类 DDL--数据定义语言 数据库…