【C++】多态语法概念

目录

    • 一、概念及定义
    • 二、虚函数重写的特例
    • 三、final和override
    • 四、抽象类

一、概念及定义

概念:在继承关系下的不同类,调用同一个函数,产生不同的行为,叫作多态。

图示:
在这里插入图片描述

定义:必须通过基类的指针或者引用调用虚函数;被调用的函数必须是虚函数。类里的函数的返回类型前加上virtual就是虚函数,子类继承父类的虚函数叫作重写,重写的是虚函数的实现,该虚函数的返回类型、函数名、参数列表都要与父类相同(有两个特例,后面再谈)。

class Person
{
public:virtual void func(){cout << "全价" << endl;}
};class Student :public Person
{
public:virtual void func(){cout << "半价" << endl;}
};void test1(Person* ps)//通过基类的指针
{ps->func();//调用虚函数
}void test2(Person& ps)//通过基类的引用
{ps.func();//调用虚函数
}int main()
{Person p;Student s;test1(&p);test1(&s);test2(p);test2(s);return 0;
}

在这里插入图片描述

注:子类的虚函数加不加virtual都没关系,但是父类一定要有virtual,否则就不是虚函数了。一般为了规范,子类也最好加上virtual

二、虚函数重写的特例

1️⃣协变
父子类的虚函数返回类型可以不相同。基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用。

class A {};
class B : public A {};
class Person {
public:virtual A* f() { return new A; }
};
class Student : public Person {
public:virtual B* f() { return new B; }
};

2️⃣析构函数的重写
如果基类的析构函数是虚函数,只要派生类的析构函数定义了,不管加不加virtual,都是虚函数。两个析构函数的函数名不相同也构成重写,因为编译器有作特殊处理,编译后析构函数的名称统一处理成destructor。

class Person
{
public:virtual ~Person(){cout << "~Person()" << endl;}
};class Student :public Person
{
public:virtual ~Student(){cout << "~Student()" << endl;}
};int main()
{Person* p = new Person;Person* s = new Student;delete p;delete s;return 0;
}

在这里插入图片描述

三、final和override

1️⃣final关键字修饰虚函数,该虚函数不能被重写
在这里插入图片描述

2️⃣override关键字是用来检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。
在这里插入图片描述

四、抽象类

概念:包含纯虚函数的类叫抽象类。纯虚函数:在虚函数的后面写上 =0,就称为纯虚函数。抽象类不能实例化对象,继承它的派生类只有重写纯虚函数才能实例化出对象。

class Animal
{
public:virtual void Action() = 0;//抽象类,纯虚函数声明即可
};class Dog :public Animal
{
public:virtual void Action()//对纯虚函数进行重写{cout << "running!" << endl;}
};class Bird :public Animal
{
public:virtual void Action()//对纯虚函数进行重写{cout << "flying!" << endl;}
};int main()
{Animal* d = new Dog;Animal* b = new Bird;d->Action();b->Action();return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【多模态大模型】Latent Diffusion:在潜在空间而非像素空间进行操作,从而减少了计算复杂度

Latent Diffusion Stable Diffusion 和 Latent Diffusion扩散模型的成本问题子问题1: 高计算成本和训练复杂度子问题2: 保持生成图像的视觉保真度子问题3: 实现多模态和高分辨率图像合成子问题4: 保持图像质量与细节Latent Diffusion 过程&#xff1a; 总结子问题/子解法1&…

实战案例:将已有的 MySQL8.0 单机架构变成主从复制架构

操作步骤 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建复制用户并授权master 主节点 将完全备份文件拷贝至从节点修改 slave 从节点 的配置&#xff08; server-id rea…

代码随想录算法训练营第四十八天(动态规划篇之01背包)| 1049. 最后一块石头的重量Ⅱ,494. 目标和

1049. 最后一块石头的重量Ⅱ 题目链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 思路 尽量将石头分为重量相同的两堆&#xff0c;这样两堆中的石头相撞之后剩下的石头就会最小。根据之前的01背包理论&#xff1a; 代码随想录算法训…

svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换

1 作用 滤镜用于对SVG图形增加特殊效果 2 效果 feBlend - 与图像相结合的滤镜feColorMatrix - 用于彩色滤光片转换feComponentTransferfeCompositefeConvolveMatrixfeDiffuseLightingfeDisplacementMapfeFloodfeGaussianBlur 高斯模糊feImagefeMergefeMorphologyfeOffset - …

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数&#xff0c;才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则&#xff1a;第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算&#xff0c;…

管理就是闭环

管理是什么&#xff1f;这个问题没有一个统一的答案。本文提供一个管中窥豹的答案&#xff1a;管理就是闭环。 作为基层管理者&#xff0c;日常管理事务&#xff0c;一个是目标闭环&#xff0c;一个是执行闭环。这分别对应敏捷PO和Scrum Master的职责。PO的职责是确保目标闭环&…

提升幸福感,中国的龙!理性看待个人发声——早读

打了过年球&#xff0c;爽&#xff01; 引言代码第一篇 人民日报 【夜读】新的一年&#xff0c;提升幸福感的6件小事第二篇 茶百道的广告文第三篇 人民日报 热搜第一&#xff01;《山河诗长安》&#xff0c;太燃了第四篇 人民日报 中国有真龙第五篇 人民日报 来啦 新闻早班车要…

Debezium发布历史122

原文地址&#xff1a; https://debezium.io/blog/2022/05/04/switch-to-java-11/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Switching to Java 11/17 May 4, 2022 by Vojtěch Jurnek community news 你可…

初步探索Pyglet库:打造轻量级多媒体与游戏开发利器

目录 pyglet库 功能特点 安装和导入 安装 导入 基本代码框架 导入模块 创建窗口 创建控件 定义事件 运行应用 程序界面 运行结果 完整代码 标签控件 常用事件 窗口事件 鼠标事件 键盘事件 文本事件 其它场景 网页标签 音乐播放 图片显示 祝大家新…

【vscode】在vscode中如何导入自定义包

只需要额外添加这两条语句即可&#xff1a; import os,sys sys.path.append("../..") 需要注意的是&#xff0c;ipynb 文件打开的工作目录是文件本身的路径&#xff0c;而 py 文件打开的工作路径是 vscode 打开的路径。 相比较而言 pycharm 中创建好项目之后并不…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

【开源】基于JAVA+Vue+SpringBoot的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

C++进阶——C++11(右值引用)

一、右值 VS 左值 官方定义是&#xff0c;可以直接取得到地址的对象就是左值&#xff0c;而不能取地址的对象就是右值。但按我的理解来说&#xff0c;如果这个对象是有名字&#xff08;变量名&#xff09;的&#xff0c;那就是左值&#xff1b;而除常量数组之外&#xff0c;如…

第206篇| 新年有趣的产品发现;所谓正确的价值观

这是2024年一月份flomo和notion 上聚合的系列文章之&#xff08;02&#xff09;&#xff1b; 具体方法用的是这个 &#xff1a; 【知识沙虫&#xff0c;一个简单易用的知识体系建模工具】https://mp.weixin.qq.com/s/V2Cdq-1PbMQYvpE4o9NLpQ 首先&#xff0c;方法用下来还是很…

人工智能能产生情绪吗?

此图片来源于网络 一、人情绪的本质是什么&#xff1f; 人的情绪本质是一个复杂的现象&#xff0c;涉及到生理、心理和社会的多个层面。以下是关于情绪本质的几种观点&#xff1a; 情绪的本质是生命能量的表达。情绪被认为是生命能量的一种体现&#xff0c;通过情绪的体验和…

【踏雪无痕的痕二】——小学一年级数学题窥探蝴蝶效应

目录 一、背景介绍二、思路&方案三、过程1.结果一致过程不一致带来的偏差2.再举两个例子&#xff0c;你品一品3.我曾经的培养计划背后的"力量"&#xff1f;4.蝴蝶效应——混沌或非线性理论什么是蝴蝶效应&#xff1f; 5.内心深处的小恶魔(人性的使然) 四、总结 一…

春节假期:思考新一年的发展思路

春节假期是人们放松身心、享受家庭团聚的时刻&#xff0c;但除了走亲戚、玩、吃之外&#xff0c;我们确实也需要思考新的一年的发展思路。以下是一些建议&#xff0c;帮助您在春节假期中为新的一年做好准备&#xff1a; 回顾过去&#xff0c;总结经验&#xff1a;在春节期间&a…

react中hook封装一个table组件 与 useColumns组件

目录 1&#xff1a;react中hook封装一个table组件依赖CommonTable / index.tsx使用组件效果 2&#xff1a;useColumns组件useColumns.tsx使用 1&#xff1a;react中hook封装一个table组件 依赖 cnpm i react-resizable --save cnpm i ahooks cnpm i --save-dev types/react-r…

系统架构24 - 软件架构设计(3)

软件架构风格&#xff08;上&#xff09; 概述架构风格数据流架构风格批处理风格管道-过滤风格 调用/返回架构风格主程序/子程序风格面向对象风格层次结构风格客户端/服务器风格 以数据为中心的架构风格仓库风格黑板风格 虚拟机架构风格解释器风格规则系统风格 独立构件架构风格…