C++的动态多态性理解

2023-05-16

多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

像我们之前学的函数重载和符号重载都是多态现象。例:使用运算符“+”使两个数相加,就是发送一个消息,他要调用operator+函数,对于不同的对象,调用不同的重载函数。

多态性可分为静态多态和动态多态。

静态多态:通过函数重载实现,要求程序在编译时就知道调用函数的全部信息。

动态多态:通过virtual function实现,在程序运行的过程中才动态地确定实现操作所针对的对象,所以他又称为运行时都多态性。

虚函数的作用:允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。下面就让我们看一段代码来加深对虚函数和动态多态的理解:

#include <iostream>
#include <cstring>
using namespace std;

class Student{
public:
    Student(int , string , float);
    void display();
protected:
    int num;
    string name;
    float score;
};
//Student类成员函数的定义
Student::Student(int n, string na, float s){
    num = n;
    name = na;
    score = s;
}

void Student::display(){
    cout<<"num: "<<num<<" name: "<<name<<" score: "<<score<<endl;
}

class Graduate:public Student
{
public:
    Graduate(int , string , float, float );
    void display();
private:
    float wage;
};
//graduate类成员函数的定义
Graduate::Graduate(int n, string na, float s, float w):Student(n,na,s){
    wage=w;
}
void Graduate::display(){
    Student::display();
    cout<<" wage: "<<wage<<endl;
}

//main函数
int main(){
    Student stu1(1001, "LiHua", 87.5);
    Graduate gra1(2001, "xiaoming", 95, 1200);
    Student *pt = &stu1;
    pt->display();
    pt=&gra1;
    pt->display();

    system("pause");
    return 0;
}

在主函数中,当我们把指针指向graduate创建的对象gra1时调用display函数,打印出来的信息只有学号、姓名、分数而没有工资,这时我们只要在student类中的display函数声明为虚函数即可,即在前面加入virtual关键字。

下面我们来了解下在使用虚函数时需要注意些什么:

  1. 只能用virtual声明类中的成员函数,把他作为虚函数,而不能将类外的普通函数声明为虚函数。因为虚函数的作用时允许在派生类中对基类的虚函数重新定义。显然他只能用于类的继承层次结构中。

  1. 一个成员函数被声明为虚函数之后,在同一类族中的类就不能再定义一个virtual的但与该虚函数具有相同的参数(包括个数和参数)和函数返回值类型的同名函数。

虚析构函数

当基类的析构函数为虚函数时,无论指针指的是同一类族中的哪一个类对象,系统都会采用动态关联,调用相应类的析构函数,对该对象进行清理工作。

构造函数不能声明为虚函数。这是因为在执行构造函数时类对象还未完成建立过程,当然谈不上把函数与类对象的绑定。

纯虚函数和抽象类

纯虚函数

纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。如果在基类中没有保留函数名字,则无法实现多态性。纯虚函数只有函数的名字而不具备函数的功能,不能被调用。可以说是“徒有其表,,而无其实“。它只是通知编译系统:“在这里声明一个虚函数,留待派生类中定义。在派生类中对此函数提高提供定义后,他才具备函数的功能,可以被调用。”

声明纯虚函数的一般形式:

virtual 函数类型 函数名(参数列表)=0;

抽象类

方式凡是包含是纯虚函数的类都市是抽象类1.一位内。因为纯虚函数是不能被调用的,包含是纯虚函数的类是无法建立对象的。抽象类的作用是作为一个类族的共同基类,或者是说,为一个类族提供一个公共接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的动态多态性理解 的相关文章

  • 丢失ucrtbased.dll,缺啥补啥

    简介 xff1a 当我打包QGC的debug版本给别人 结果别人编译不了 xff0c 内容显示缺少ucrtbased dll文件 发现一个不错的网站 xff0c 缺少其他文件 xff0c 一样的方法 解决办法 xff1a 打开链接 xff1
  • 打开QGC软件主页没有显示,弹窗白板问题

    目录 问题描述 解决办法 问题描述 正常情况下 xff0c QGC打开是直接就弹出显示页面 但当我打开编译过的debug版本QGC xff0c 会出现一个大约1秒的弹窗 xff0c 之后QGC没有显示 我在旁边的任务栏中查看 xff0c 发
  • Ubuntu/Linux文件权限修改

    Ubuntu Linux文件权限 文件权限是指不同的用户或用户组对某个文件拥有的权限 xff0c 文件的权限分为三种 xff1a r xff1a 读 w xff1a 写 x xff1a 可执行 文件描述形式如下 xff1a rw rw r
  • RTOS必备基础

    RTOS必备基础 一 ARM基础知识1 ARM架构2 重要寄存器3 汇编指令详解读 xff1a load写 store加 ADD减 SUB出栈 push出栈 xff1a pop 4 栈和堆 xff1a 1 栈2 堆 5 局部变量和全局变量的
  • STM32必备知识点(面试和工作用的到)

    STM32必备知识点 xff08 面试和工作用的到 xff09 文章目录 STM32必备知识点 xff08 面试和工作用的到 xff09 前言嵌入式C基础一 位操作1 不改变其他位的值的状况下 xff0c 对某几个位进行设值2 移位操作提高
  • 嵌入式C语言必备知识(面试和工作都用得到)

    嵌入式C语言必备知识 xff08 面试和工作都用得到 xff09 一 基础部分1 数组与链表的区别 xff1f 2 C语言程序代码优化方法3 堆和栈的的区别 xff1f 4 内联函数的优缺点和适用场景是什么 xff1f 4 下面代码输出是什
  • SBUS协议介绍和标准例程

    SBUS信号例程详解 1 SBUS信号简介1 硬件标准2 软件标准1 串口配置 xff1a 2 协议格式 xff1a 3 数据范围4 间隔问题 2 STM32F4 Sbus xff08 DMA 43 串口 xff09 xff08 1 xff
  • RT-Thread静态线程和动态线程的区别

    RT Thread 内核采用面向对象的设计思想进行设计 xff0c 系统级的基础设施都是一种内核对象 xff0c 例如线程 xff0c 信号量 xff0c 互斥量 xff0c 定时器等 内核对象分为两类 xff1a 静态内核对象和动态内核对
  • UART协议入门

    UART 硬件连接关键词 xff1a 1 UART为串行异步协议2 TTL RS232 RS485是一种逻辑电平表示方式 3 帧格式 xff1a 1位空闲位 xff0c 5 9位的数据位 xff0c 1位校验位 xff0c 1 2位的停止位
  • git操作手册

    初始化一个Git仓库 xff0c 使用git init命令 添加文件到Git仓库 xff0c 分两步 xff1a 使用命令git add lt file gt xff0c 注意 xff0c 可反复多次使用 xff0c 添加多个文件 xff1
  • STM32 开发常见问题汇总

    STM32 开发常见问题汇总 一 xff0c STM32 Usart 串口异常四个错误检测标志 xff1a 十个具有标志位的中断源 xff1a 1 Usart中断事件2 Usart状态寄存器3 Usart问题解决3 1 什么是ORE中断 x
  • Gitee克隆别人的仓库的操作步骤

    1 指定克隆仓库路径 以及克隆到本地项目自定义名称 可以克隆提交者配置的url映射 但是不能克隆提交者的账号 git config git clone https gitee com lisi giteedemo giteedemo 2 配
  • c++八数码难题全家桶(A*算法、双向BFS、BFS、DFS)

    文章目录 系列文章目录前言 目录 系列文章目录 文章目录 前言 一 八数码难题是什么 xff1f 二 算法详解 1 首先利用逆序数来判断是否有解 xff08 奇偶性相同即可达 xff09 2 A 算法 3 双向BFS 4 BFS 5 DFS
  • Horspool (String Matching)

    Description of Horspool Assumation text string the string where we want to locate the pattern string n the length of the
  • C语言课程设计学生成绩管理系统二(含完整代码)

    亲给个打赏吧 1 系统功能 xff08 1 xff09 通过菜单的形式实现人机交互界面 xff08 2 xff09 实现录入学生基本信息和成绩功能 xff08 3 xff09 实现删除指定学生的基本信息和成绩功能 xff08 4 xff09
  • UNIX环境高级编程笔记

    UNIX环境编程 一 UNIX基础知识1 1 Linux 主要特性1 2 Linux 内核1 3 Linux 目录结构1 4 登录1 登录名2 shell 1 5 输入和输出1 文件描述符2 标准输入 标准输出 标准错误3 不带缓冲的IO4
  • 使用TensorFlow Serving进行模型的部署和客户端推理

    目的 xff1a 在一个server端使用TensorFlow框架对模型进行训练和保存模型文件后用TensorFlow Serving进行部署 xff0c 使得能在客户端上传输入数据后得到server端返回的结果 xff0c 实现远程调用的
  • spring boot自动打开浏览器和配置打开首页

    目录 前言 一 配置自动打开浏览器 在启动器同级目录下创建config文件夹来放启动配置类 下面是application properties的配置 二 配置默认首页 总结 前言 如何配置自动打开浏览器 和默认页面设置 一 配置自动打开浏览
  • 使用内网穿透工具natapp

    一 使用准备 1 进入他的官网注册一个账号 NATAPP 内网穿透 基于ngrok的国内高速内网映射工具 注意 这个账号还必须要提交实名认证 2 然后登陆进去 选择 购买隧道 gt 免费隧道 然后最重要的是配置一下免费隧道的协议 选择web
  • 在linux下安装docker

    文章目录 目录 文章目录 前言 一 docker 二 使用步骤 1 环境准备 2 安装 三 配置阿里云镜像加速 四 卸载 总结 前言 一 docker 镜像 xff08 image xff09 xff1a docker镜像就好比是一个模板

随机推荐

  • git分支管理开发

    1 master从来都只是最终合并的分支 xff1b 2 所有的其他分支都从master衍生 xff1b 3 在master分支直接修改 xff0c 有可能会造成所有分支的冲突 4 都是从master建立新分支 xff0c 修改测试通过后合
  • Docker的常用命令

    文章目录 目录 文章目录 前言 一 帮助命令 二 镜像命令 1 查看镜像 2 搜索镜像 3 下载镜像 4 删除镜像 三 容器命令 1 启动容器 2 查看容器 3 退出容器 4 删除容器 5 启动和停止容器 四 常用的其它命令 后台运行 查看
  • spring cloud gateway网关和链路监控

    文章目录 目录 文章目录 前言 一 网关 1 1 gateway介绍 1 2 如何使用gateway 1 3 网关优化 1 4自定义断言和过滤器 1 4 1 自定义断言 二 Sleuth 链路追踪 2 1 链路追踪介绍 2 2 Sleuth
  • sso单点登录

    文章目录 目录 文章目录 前言 一 sso结构实现 二 使用步骤 2 1 建一个spring cloud 项目 2 2 common下的core的配置 2 3 实现系统的业务微服务 2 4 sso模块的编写 总结 前言 单点登录 Singl
  • windows版 redis在同一局域网下互联

    项目场景 xff1a 同一局域网下各个主机互相连接同一个redis 问题描述 无法连接 原因分析 xff1a 没有放行对方的地址 解决方案 xff1a 修改配置文件 最重要的一步如下 然后把 redis windows conf的文件也照上
  • mysql数据库之存储过程

    文章目录 目录 文章目录 前言 一 存储引擎 1 1 InnoDB 1 2 MyISAM 二 存储过程 2 1 存储过程 2 1 1 创建存储过程 2 1 2 调用存储过程 2 1 3 查看存储过程 2 1 4 删除存储过程 2 2 语法
  • 秒杀的理解

    项目场景 xff1a 秒杀限时或者限量的处理一件商品 实现理解 xff1a 秒杀业务流程 如果使用java逻辑判断减库存的话 xff0c 会出现多个线程同时修改好库存 xff0c 然后存入相同的修改值 实际上是卖出了多个 但是数据库只扣了一
  • VUE3的setup函数

    文章目录 目录 文章目录 前言 一 setup函数是什么 xff1f 二 使用步骤 三 vue3中文文档和面向vue3的组件库 总结 前言 Vue3是一个面向数据驱动的渐进式JavaScript框架 xff0c 其的设计理念包括简洁 灵活和
  • 几种实现promise队列的方法

    第一种 xff1a 使用map实现promise队列 初始值为promise resolve 为成功状态 xff0c 每次成功都返回一个promise xff0c 依次执行 span class token keyword function
  • SD卡在烧录镜像系统之后恢复正常使用

    问题 xff1a 我们知道发现镜像系统烧录完毕以后将SD卡插入电脑 xff0c 电脑会找不到SD卡 xff0c 也无法读取SD卡显示 实际是可以的只是不能正常显示出来 xff0c 这是正常现象 如果我们的开发板 xff08 如jetson
  • 手工制作F450四旋翼无人机的工具准备以及apm调参 GPS调参等相关工作

    F450 是一款大量航模爱好者都很喜欢的一款无人机结构 xff0c 很多想动手制作无人机的同学 xff0c 都是从这一款机型开始的 xff0c 当然我也是 xff0c 在制作一款无人机 xff0c 我们需要以下部件准备 xff0c 1 xf
  • git合并分支

    前提 xff1a 所有开发在develop xff0c 最后合并到master 1 从master建立本地分支temp xff0c git checkout b temp xff0c 这个temp分支不要发布到远程仓库 xff1b 2 在t
  • Java基础笔记一

    Java基础笔记一 本文章是作者学习B站系列视频 狂神说Java 的记录笔记与心得 xff0c 创作不易 xff0c 希望能够得到您的支持 Java程序运行机制 编译型 xff1a 完整编译 Java编译器将 java 文件编译为 clas
  • 树莓派4b入门以及各种系统烧录问题分享

    文章目录 前言一 买一个树莓派二 上系统三 系统烧录故障情况1 固件问题2 验证失败3 插入主板 xff0c 报错 xff1a VFS Unable to mount root fs on unknown block 179 2 1 重新格
  • gazebo保存world时出现问题

    gazebo保存world时出现没反应 xff0c 以为卡死了 xff0c 可最小化的时候能看到保存界面弹出 可以每次最小化再放大 xff0c 以此刷新界面 xff0c 一步一步保存
  • Windows向日葵连接Ubuntu时“连接已断开”解决方案

    环境 控制端 xff1a Windows10 系统 xff0c 向日葵版本12 5 1 44969 被控端 xff1a Ubuntu20 04 系统 xff08 默认gdm3桌面 xff09 xff0c 向日葵版本11 0 0 36662
  • [调参神器]使用VOFA+上位机进行PID调参(附下位机代码)

    1 VOFA 43 是啥 简单地来说 xff0c VOFA 43 是一个超级串口助手 xff0c 除了可以实现一般串口助手的串口数据收发 xff0c 它还可以实现数据绘图 xff08 包括直方图 FFT图 xff09 xff0c 控件编辑
  • visual studio 2022 调试时如何1、打开监视窗口;2、监视窗口无法输入问题

    1 如何打开监视窗口 xff1a 注意要先点击调试 xff0c 不然没有这个窗口 2 如果窗口显灰色 xff0c 说明当前调试状态没有中断 xff0c 而只有中断的时候才可以输入或修改 3 点击调试里的 全部中断 后就可以输入了 xff01
  • 单片机学习——定时器/计数器

    单片机必学系列 单片机学习 中断系统 单片机学习 存储器详解 xff08 程序存储器 片内RAM 拓展RAM EEPROM xff09 单片机学习 定时器 计数器 单片机学习 A D转换 更新ing 单片机学习 定时器 计数器 单片机必学系
  • C++的动态多态性理解

    多态 xff1a 指允许不同类的对象对同一消息做出响应 即同一消息可以根据发送对象的不同而采用多种不同的行为方式 xff08 发送消息就是函数调用 xff09 像我们之前学的函数重载和符号重载都是多态现象 例 xff1a 使用运算符 43