c++ - 多态
文章目录
- 一、多态的概念
- 二、多态使用
- 三、多态的原理
一、多态的概念
1、概念:
多态就是具有多种形态,可以理解为同一个行为不同对象去完成表现出不同的状态,如:

二、多态使用
1、构成多态的条件
(1)派生类要对基类虚函数进行重写。
(2)通过基类指针或引用调用虚函数。
2、虚函数
关键字:virtual,加在函数声明前面,并且该函数是非静态成员函数。
如:

3、函数重写
(1)条件:
派生类重写的函数返回值、函数名称、函数参数与基类相同。
(2)使用
class Person {
public:
//虚函数virtual void test01(){//...}
};
class Student : public Person {
public://重写 virtual关键字在派生类中写不写都可virtual void test01(){//...}
};
(3)例外
协变:
派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指
针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。
class Person {
public:virtual Person& test01(){//...}
};
class Student : public Person {
public://重写 返回值是继承关系virtual Student& test01(){//...}
};
析构函数:
如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,
都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,
看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处
理,编译后析构函数的名称统一处理成destructor。
如果出现以下情况就会出现子类没有析构
class Person {
public:~Person() { cout << "~Person()" << endl; }
};
class Student : public Person {
public:~Student() { cout << "~Student()" << endl; }
};void test()
{//情况//不重写析构函数时Person* p = new Student;delete p;
}

如果重写之后调用调用子类的析构,子类的析构再去调用父类析构就不会出现以上情况了。
class Person {
public:virtual ~Person() { cout << "~Person()" << endl; }
};
class Student : public Person {
public:~Student() { cout << "~Student()" << endl; }
};void test()
{Person* p = new Student;delete p;
}

(3)重载、重定义(隐藏)、重写的区别
重载:同一作用域下,函数名相同,参数(类型、个数、顺序)不同。
重定义:作用域不同(派生类域、基类域),函数名相同。
重写:作用域不同(派生类域、基类域),必需是虚函数,函数名相同、返回类型相同、参数相同。
(4)使用多态
class Person {
public://虚函数virtual void test01() {cout << "Person" << endl;}
protected:int _a;
};class Student : public Person {
public:virtual void test01() {cout << "Student" << endl;}
protected:int _b;
};void Print(Person* pp)
{pp->test01();
}void test()
{Person p;Student s;//基类对象,传给基类指针pp,pp还是基类 ->不构成多态,依然使用基类的函数Print(&p);//派生类对象,传给基类指针pp,pp指向的是派生类-> 构成多态,使用的是派生类重写的函数Print(&s);
}
4、抽象类
(1)纯虚函数
在虚函数声明后面加上 =0 就是纯虚函数了。
virtual void test01() = 0;
(2)
拥有纯虚函数的类叫做抽象类,抽象类不能被实例化,当派生类继承抽象类后,必须重写抽象类中的纯虚函数,不然该派生类依旧还是抽象类,不能被实例化。
//抽像类
class Person {
public://纯虚函数virtual void test01() = 0;
};
class Student : public Person {
public://重写纯虚函数virtual void test01(){cout << "virtual void test01()" << endl;}
};
三、多态的原理
1、虚函数表
一个类中存在虚函数是会生成一个指针,该指针指向的内容就是虚函数表。
在x86环境下:
//抽像类
class Person {
public://虚函数virtual void test01() {};
protected:int _a;
};void test()
{Person p;cout << sizeof(Person) << endl;
}



当派生类继承基类时也会产生一个虚函数指针,该指针指向的内容一部分是从父类继承下来的,一部分是重写的。

test01()使用了派生类的,test02()没有重写,还是使用基类的。
2、多态原理

满足多态以后的函数调用,不是在编译时确定的,是运行起来以后到对象的中取找的。不满足多态的函数调用时编译时确认好的(运行时确定)。
3、动态绑定和静态绑定
- 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,
比如:函数重载 - 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体
行为,调用具体的函数,也称为动态多态。
4、多继承与多态
class Person1{
public://虚函数virtual void test01() {};protected:int _a;
};class Person2 {
public://虚函数virtual void test02() {};protected:int _b;
};class Student : public Person1, public Person2 {
public://重写Person1void test01(){}//重写Person2void test02() {}void test03(){}
protected:int _b;
};void test()
{Student s;
}
多继承时每个基类会生成相应的虚函数指针。

相关文章:
c++ - 多态
文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念: 多态就是具有多种形态,可以理解为同一个行为不同对象去完成表现出不同的状态,如: 二、多态使用 1、构成多态的条件 (1)派…...
亚马逊云科技EC2简明教程
💡 完全适用于新手操作的Amazon EC2引导教程 简述 在亚马逊云科技中,存在多种计算服务,在此,我们将会着重讨论Amazon EC2(以下简称EC2),EC2作为亚马逊云科技的明星产品、核心产品,是大多数开发者和企业用…...
TCP网络传输控制协议
目录 什么是TCP TCP的特点 TCP通信步骤 三次握手(建立连接) 数据传输 四次挥手(连接释放) 为什么要进行三次握手?两次握手行不行?一次握手行不行? 为什么是四次挥手?三次、两…...
PCDN技术如何应对网络带宽限制?(壹)
PCDN技术应对网络带宽限制的操作主要包括以下几个方面: 利用边缘计算资源:PCDN是以P2PCDN技术为基础,通过挖掘利用边缘网络海量碎片化闲置资源来构建内容分发网络。这意味着,当网络带宽受限时,PCDN能够更有效地利用这…...
Java数据结构-链表与LinkedList
链表 链表的概念 链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说,相比较于顺序表(物理上连续,逻辑上也连续),链表物理上不一定连续。 链表是…...
单元测试实施最佳方案(背景、实施、覆盖率统计)
1. 什么是单元测试? 对于很多开发人员来说,单元测试一定不陌生 单元测试是白盒测试的一种形式,它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性,以确保每个单元按照预期执行。单元测试通…...
mysql笔记(表导出文件,文件导入表)
遇见权限问题1: cat /etc/my.cnf加入[mysqld] secure_file_priv ""遇见目录错误2:因为 MySQL 服务器没有权限在根目录下创建文件。你可以尝试将文件导出到一个 MySQL 服务器有权限写入的目录下,例如 MySQL 数据目录或 /tmp目录。sudo chmod 755 /path/to…...
Navicat 17 新特性 | 原生支持 Linux ARM 平台以及银河麒麟和统信操作系统
随着 Navicat 17 的发布,引起了业界的广泛共鸣与热烈讨论。此前,我们深入探讨了Navicat 17的多项新特性,涵盖《模型设计:引领创新,优化升级》,《高效的查询与配置》以及《用户界面交互:流畅体验…...
【pytorch】手写数字识别
https://blog.csdn.net/qq_45588019/article/details/120935828 基本均参考该博客 《深度学习原理Pytorch实战》 初步处理 导包 import torch import numpy as np from matplotlib import pyplot as plt from torch.utils.data import DataLoader from torchvision import tr…...
SpringBoot3.3.0升级方案
本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案,新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后,可不设置系统变量java_home,仅在id…...
用 Kotlin 编写四则运算计算器:从零开始的简单教程
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
java算法day13
java算法day13 104 二叉树的最大深度111 二叉树的最小深度226 翻转二叉树101 对称二叉树100 相同的树 104 二叉树的最大深度 我最开始想到的是用层序遍历。处理每一层然后计数。思路非常的清楚。 迭代法: /*** Definition for a binary tree node.* public class…...
方便快捷传文件—搭建rsync文件传输服务器
比如我们有一个服务器,想把各个机器的文件都通过脚本传给这台机,用sftp或者直接rsync就必须输密码,肯定不行,做等效性免密又麻烦,怎么办呢,这么办! 在服务端 yum -y install rsync #编辑&…...
python调用qt编写的dll
报错:FileNotFoundError: Could not find module F:\pythonProject\MINGW\sgp4Lib.dll (or one of its dependencies). Try using the full path with constructor syntax. 只有两种情况: 1.路径不对 2.库的依赖不全 1、如果是使用了qt库的࿰…...
SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测
SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-CNN-LSTM-Mutilhead-Attention北方苍鹰算…...
【Redis】初识 Redis
文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …...
【PTA天梯赛】L1-003 个位数统计(15分)
作者:指针不指南吗 专栏:算法刷题 🐾或许会很慢,但是不可以停下来🐾 文章目录 题目题解总结 题目 题目链接 题解 使用string把长度达1000位的数字存起来开一个代表个位数的数组 a[11]倒序计算最后一位,…...
c语言位操作符相关题目之交换两个数的值
文章目录 一、题目二、方法11,思路2,代码实现 三、方法21,思路2,代码实现 四、方法31,思路2,代码实现 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 实现两个变量的…...
智能家居装修怎么布线?智能家居网络与开关插座布置
打造全屋智能家居。计划的智能家居方案以米家系列为主,智能家居联网方案以无线为主。装修前为了装备智能家居做了很多准备工作,本文深圳侨杰智能分享一个智能家居装修和布线方面的心得与实战知识。希望能对大家的装修有所帮助。 1.关于网络 如果房子比…...
GD32MCU最小系统构成条件
大家是否有这个疑惑:大学课程学习51的时候,老师告诉我们51的最小系统构成?那么进入32位单片机时代,gd32最小系统构成又是怎么样的呢? 1.供电电路 需要确保供电的电压电流稳定,以东方红开发版为例ÿ…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
