当前位置: 首页 > news >正文

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;
}

相关文章:

  • Java的全局异常处理代码
  • Qt入门教程(一):Qt使用的基本知识
  • SQL面试题练习 —— 查询前2大和前2小用户并有序拼接
  • Vue 与 React 区别
  • 选GPU运行
  • 大模型+多模态合规分析平台,筑牢金融服务安全屏障
  • React+TS 从零开始教程(4):useEffect
  • Qt中使用MySQL数据库详解,好用的模块类封装
  • 比较Java爬虫框架:哪个是最佳选择?
  • PostgreSQL 性能优化与调优(六)
  • Java核心知识(一):JVM
  • PDF一键转PPT文件!这2个AI工具值得推荐,办公必备!
  • Vue 全局状态管理新宠:Pinia实战指南
  • 网络编程:使用UDP实现数据帧的接收
  • AI安全研究滞后?清华专家团来支招
  • 【刷算法】求1+2+3+...+n
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • ECS应用管理最佳实践
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Javascript设计模式学习之Observer(观察者)模式
  • Java超时控制的实现
  • React Native移动开发实战-3-实现页面间的数据传递
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SQLServer之索引简介
  • 分布式熔断降级平台aegis
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 离散点最小(凸)包围边界查找
  • 利用jquery编写加法运算验证码
  • 面试遇到的一些题
  • 配置 PM2 实现代码自动发布
  • 浅谈Golang中select的用法
  • 算法-插入排序
  • 微服务核心架构梳理
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #AngularJS#$sce.trustAsResourceUrl
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (007)XHTML文档之标题——h1~h6
  • (2)STL算法之元素计数
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (70min)字节暑假实习二面(已挂)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (搬运以学习)flask 上下文的实现
  • (笔试题)分解质因式
  • (层次遍历)104. 二叉树的最大深度
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)跟我一起学习VIM - The Life Changing Editor