【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://www.mzph.cn/news/678527.shtml

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

相关文章

Linux基础-文件层次结构

1./ 1.根&#xff0c;理解为Windows的C盘 2.目录的分隔符 /dir1/dir2&#xff0c;根目录下有个dir1目录&#xff0c;在dir1目录下有个dir2的目录 2./etc 1.装软件&#xff08;rpm方式&#xff09;所在的路径 2.重要的Linux配置文件 3./boot 引导Linux系统有关的内核kernel…

深度学习的新进展:解析技术演进与应用前景

深度学习的新进展&#xff1a;解析技术演进与应用前景 深度学习&#xff0c;作为人工智能领域的一颗璀璨明珠&#xff0c;一直以来都在不断刷新我们对技术和未来的认知。随着时间的推移&#xff0c;深度学习不断迎来新的进展&#xff0c;这不仅推动了技术的演进&#xff0c;也…

为什么电能难以存储

为什么电能难以存储 电能是动态的过程性能源&#xff0c;不像石油、煤、天然气等含能体能源&#xff0c;故不能直接储存&#xff0c;而是通过电力网实现生产、输送和消纳同步进行&#xff0c;通过自动及人工调节实现供需平衡&#xff0c;用多少生产多少。 就是由于电能是动态…

对话模型Demo解读(使用代码解读原理)

文章目录 前言一、数据加工二、模型搭建三、模型训练1、构建模型2、优化器与损失函数定义3、模型训练 四、模型推理五、所有Demo源码 前言 对话模型是一种人工智能技术&#xff0c;旨在使计算机能够像人类一样进行对话和交流。这种模型通常基于深度学习和自然语言处理技术&…

深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之列存(二)

Elasticsearch&#xff0c;作为当下最流行的开源搜索和分析引擎之一&#xff0c;其内部的数据结构和存储机制对于确保高效搜索和快速响应查询至关重要。在这其中&#xff0c;列存储&#xff08;Doc Values&#xff09;扮演了一个核心角色。本文将深入探讨Doc Values是什么、它们…

HTTP 超文本传送协议

1 超文本传送协议 HTTP HTTP 是面向事务的 (transaction-oriented) 应用层协议。 使用 TCP 连接进行可靠的传送。 定义了浏览器与万维网服务器通信的格式和规则。 是万维网上能够可靠地交换文件&#xff08;包括文本、声音、图像等各种多媒体文件&#xff09;的重要基础。 H…

HarmonyOS 开发学习笔记

HarmonyOS 开发学习笔记 一、开发准备1.1、了解ArkTs语言1.2、TypeScript语法1.2.1、变量声明1.2.2、条件控制1.2.3、函数1.2.4、类和接口1.2.5、模块开发 1.3、快速入门 二、ArkUI组件2.1、Image组件2.2、Text文本显示组件2.3、TextInput文本输入框组件2.4、Button按钮组件2.5…

json模块(高维数据的存储与读取)

json模块是 Python 标准库中的一个模块&#xff0c;用于处理 JSON&#xff08;JavaScript Object Notation&#xff09;格式的数据。JSON是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。模块提供了在 Python 中进行 JSON 编码&…

开源个人订阅跟踪器Wallos

本文软件由网友 P家单推人 推荐&#xff1b; 什么 Wallos &#xff1f; Wallos 是一款功能强大、开源且可自我托管的网络应用程序&#xff0c;旨在让您轻松管理财务。告别复杂的电子表格和昂贵的财务软件–Wallos简化了跟踪费用的过程&#xff0c;帮助您更好地控制财务生活。 软…

C++ | KMP算法模板

next数组初始化 char a[1000006];//原串 char p[1000006];//子串 int pmt[1000006];void getNext(int m){int j0;pmt[0]0;for(int i1;i<m;i){while(j>0 && p[i]!p[j])jpmt[j-1];if(p[i]p[j])j;pmt[i]j;} }以下实例基于上述getNext函数及数据结构执行&#xff1a…

java实战:生成会议通知Word文件

本文将介绍如何使用Java和Apache POI库来生成包含标题、正文、时间、会议地点、参会人等信息的会议通知Word文件。包含如何设置文本格式、添加标题和段落&#xff0c;以及如何将生成的Word文件保存到磁盘。看完这篇文章&#xff0c;可以掌握使用Java操作Word文档的基本技能。 …

DockerPodman save

DockerPodman save docker image save docker save docker image save 参数只有一个 -o 或 --output ,后接输出文件, 也可以写成 > , 但> 输出文件只能写在最后 , -o和--outpu可以写在前面也可以写在后面 用途: 将Image镜像保存为tar文件 为标准输出流生成一个 tar…

LeetCode---383周赛

题目列表 3028. 边界上的蚂蚁 3029. 将单词恢复初始状态所需的最短时间 I 3030. 找出网格的区域平均强度 3031. 将单词恢复初始状态所需的最短时间 II 一、边界上的蚂蚁 这题没什么好说的&#xff0c;模拟就行&#xff0c;本质就是看前缀和有几个为0。 代码如下 class S…

Spring Cloud Hystrix 参数配置、简单使用、DashBoard

Spring Cloud Hystrix 文章目录 Spring Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数…

【java】12:封装

面向对象编程三大特征 1.基本介绍 面向对象编程有三大特征&#xff1a;封装、继承和多态。 2.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&am…

开局一个破碗的故事例子

在一个寒冷的冬日&#xff0c;一个瘦弱的小姑娘拿着一个破碗&#xff0c;孤独地走在被白雪覆盖的街道上。她的名字叫小梅&#xff0c;她的父母早逝&#xff0c;留下她一个人在这个世界上艰难地生活。 小梅的破碗里只有几个铜板&#xff0c;那是她前一天沿街乞讨所得&#xff0c…

林浩然与杨凌云的Java世界奇遇记:垃圾回收大冒险

林浩然与杨凌云的Java世界奇遇记&#xff1a;垃圾回收大冒险 The Java Adventure Chronicles of Lin Haoran and Yang Lingyun: Garbage Collection Odyssey 在一个充满0和1代码森林的世界里&#xff0c;住着两位勇敢的程序员侠侣——林浩然和杨凌云。林浩然是个身怀Java绝技的…

【vue】axios 如何调用 htttp 接口

安装依赖&#xff1a; npm install core-js导入 core-js &#xff1a; import core-js/modules/web.url-search-params;通过调用 new URLSearchParams &#xff0c;然后 append 来准备好要传入的参数&#xff1a; let param new URLSearchParams() param.append(content, 啦…

深度学习模型与神经网络可视化工具

很多时候&#xff0c;我们需要对神经网络本身的结构有一个了解&#xff0c;并且进行一定程度的可视化&#xff0c; 这里推荐一个优秀的工具 Zetane Engine Zetane Insight Engine: Accelerate Data Analysis with AI-Powered Insights. Free download of most-detailed visu…

springboot/ssm档案管理系统公司设备管理系统Java系统企业配件系统

springboot/ssm档案管理系统公司设备管理系统Java系统企业配件系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysq…