C++多态(全)

多态

概念

调用函数的多种形态,

多态构成条件

1)父子类完成虚函数的重写(三同:函数名,参数,返回值相同)

2)父类的指针或者引用调用虚函数

虚函数

被virtual修饰的类成员函数

注意

1)只有类的非静态成员函数前才可以加上virtual 

2)虚函数的virtual与虚继承的virtual是同一个关键字。虚函数中的virtual是为了实现多态,虚继承的virtual是为了菱形继承中数据冗余和二义性。

虚函数的重写

也叫虚函数的覆盖

派生类中有一个完全相同的虚函数(返回值类型相同,函数名相同,参数列表相同),就叫做派生类的虚函数重写了基类的虚函数

结果:通过父类Person的指针或引用调用虚函数

父类指针要是指向父类对象则调用父类的虚函数

要是指向子类对象则调用子类虚函数

#include<iostream>
using namespace std;
class Person
{
public:virtual void BuyTicket(){cout << "买票半价" << endl;}
};
class Student :public Person
{
public:virtual void BuyTicket(){cout << "买票半价" << endl;}
};
void Func(Person& people)
{people.BuyTicket();
}
int main()
{Student s;Func(s);return 0;
}
注意

1)派生类的虚函数可以不用加上virtual关键字(不规范,建议加上)

虚函数的两个例外

1)协变

基类和派生类的返回值不同

当基类虚函数返回基类对象的指针或引用

派生类虚函数返回派生类对象的指针或引用

#include<iostream>
using namespace std;//基类
class A
{};
//子类
class B : public A
{};
//基类
class Person
{
public://返回基类A的指针virtual A* fun(){cout << "A* Person::f()" << endl;return new A;}
};
//子类
class Student : public Person
{
public://返回子类B的指针virtual B* fun(){cout << "B* Student::f()" << endl;return new B;}
};
void Func(Person& p)
{p.fun();
}
int main()
{Student s;Func(s);return 0;
}

2)析构函数的重写

基类和派生类的析构函数名字不同

当基类的析构函数是虚函数,只要派生类析构函数定义,就构成重写

作用:

要是没有重写,指向子类的指针只会调用父类的析构函数,有可能造成内存泄漏

推荐:

一般把父类的析构函数写成虚函数,反之发生内存泄漏

注意:

在继承中,子类和父类的析构函数会构成隐藏就是因为,虽然子类析构函数和父类的析构函数函数名虽然不同,但是为了构成重写,编译后的析构函数名字会统一处理为destructor();

void test2()
{Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;//本来希望指向父类的指针析构父类//指向子类的指针去析构子类//因此需要虚函数,构成重写
}

c++11

1)override:检查派生类虚函数是否重写了基类的某个虚函数,没有则编译错误

//子类
class Student : public Person
{
public://子类完成了父类虚函数的重写,编译通过virtual void BuyTicket() override{cout << "买票-半价" << endl;}
};

2)final:修饰虚函数,表示该虚函数不能再重写

//父类
class Person
{
public://被final修饰,该虚函数不能再被重写virtual void BuyTicket() final{cout << "买票-全价" << endl;}
};

易错例题

纯虚函数

在虚函数后面写上=0

抽象类(接口类):包含纯虚函数的类

特点

1)抽象类不能实例化对象

2)强制派生类重写虚函数(不重写则会继承纯虚函数,又变为抽象类了又不能实例化对象了)

3)用抽象类(父类)的指针调用虚函数

作用

1)抽象类能更好的

#include <iostream>
using namespace std;
//抽象类(接口类)
class Car
{
public://纯虚函数virtual void Drive() = 0;
};
int main()
{Car c; //抽象类不能实例化出对象,errorreturn 0;
}

#include <iostream>
using namespace std;
//抽象类(接口类)
class Car
{
public://纯虚函数virtual void Drive() = 0;
};
//派生类
class Benz : public Car
{
public://重写纯虚函数virtual void Drive(){cout << "Benz-舒适" << endl;}
};
//派生类
class BMV : public Car
{
public://重写纯虚函数virtual void Drive(){cout << "BMV-操控" << endl;}
};
int main()
{//派生类重写了纯虚函数,可以实例化出对象Benz b1;BMV b2;//不同对象用基类指针调用Drive函数,完成不同的行为Car* p1 = &b1;Car* p2 = &b2;p1->Drive();  //Benz-舒适p2->Drive();  //BMV-操控return 0;
}

抽象类作用

1)用来表达没有实例对象的抽象类型

2)强制子类重写虚函数(同override)

原理

多态调用:运行时,到指向对象的虚表中找虚函数调用

普通调用:编译时,调用的对象是那个类型就调用它的函数

虚表:虚函数表,存虚函数的地址,目标实现多态

虚基表:存的是当前位置距离虚基类部分的偏移量,解决菱形继承和二义性的问题

虚函数和普通函数一样:在代码段中,不是在虚表中的(虚表内的是虚函数的地址

虚表在常量区

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

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

相关文章

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Python 深度学习(一)

原文&#xff1a;zh.annas-archive.org/md5/98cfb0b9095f1cf64732abfaa40d7b3a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 随着全球对人工智能的兴趣不断增长&#xff0c;深度学习引起了广泛的关注。每天&#xff0c;深度学习算法被广泛应用于不同行业。本书…

[GXYCTF 2019]BabyUpload

过滤 <? 且后缀不能有 php 上传1.jpg文件&#xff0c;内容为&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 但文件后缀为.jpg&#xff0c;蚁剑不能连接。那怎么办呢&#xff1f; .htaccess文件&#xff1a;解析.jpg文件中的php代码 &#xf…

oracle的sqlplus默认会执行的脚本

我原来是知道sqlplus会默认执行$ORACLE_HOME/sqlplus/admin/glogin.sql这个脚本 今天在一个陌生的环境调用sqlplus时总会默认执行两条语句 但是就是找不到被执行的文件在哪里 后来发现是在环境变量 ORACLE_PATH下的login.sql文件 ORACLE_PATH这个环境变量是sqlplus这个工具使用…

【QEMU系统分析之实例篇(七)】

系列文章目录 第七章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第七章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.目标机器创建过程3.cpu_exec_init_all()io_mem_init()memory_…

HTML_CSS学习:CSS选择器

一、通配选择器 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>通配选择器</title><style>* {color: #1b8335;font-size: 40px;}/*可以选中所有的HTML元素*/<…

【C语言】——数据在内存中的存储

【C语言】——数据在内存中的存储 一、整数在内存中的存储1.1、整数的存储方式1.2、大小端字节序&#xff08;1&#xff09;大小端字节序的定义&#xff08;2&#xff09;判断大小端 1.3、整型练习 二、浮点数在内存中的存储2.1、引言2.2、浮点数的存储规则2.3、浮点数的存储过…

macbookproM2通过docker安装CDH

背景&#xff1a;项目中用的CDH大数据集群&#xff0c;但是自己的电脑上是MacM芯片的系统&#xff0c;网上在arm架构上搭建CDH集群的资料太少了&#xff0c;所以自己尝试搭建并且梳理一下文档 一、启动docker 我安装的是桌面版的docker 二、搜索CDH的镜像&#xff0c;然后拉…

【八大排序(三)】快速排序

❣博主主页: 33的博客❣ ▶️文章专栏分类:八大排序◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多排序知识 目录 1.前言2.快速排序2.1概念2.2画图理解2.3递归代码实现2.3.1Hoare法2.3.2挖坑法2.3.3前…

【介绍下OneFlow概念清单】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

智能健康管理系统的一次新体验

智能健康管理系统是一个集成了多方面数据资源&#xff0c;并配合人工智能算法的健康管理系统。该系统的应用涉及多个领域&#xff0c;包括医学、科学、生态和医疗保健等。其服务对象包括健康人群、亚健康人群和疾病人群&#xff0c;旨在通过病因预防、临床前期预防和临床预防三…

Java设计模式 _结构型模式_组合模式

一、组合模式 1、组合模式 组合模式&#xff08;Composite Pattern&#xff09;是这一种结构型设计模式。又叫部分整体模式。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次关系。即&#xff1a;创建了一个包含自己对象组的类&#xff0c;该类提供了修改…

代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数 题目详情 解题思路 这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针&#xff0c;通过局部贪心来解决&#xff0c;但是如果两边相等的话用局部贪心无法来判断到底取哪一边&#xff0c;那我们不妨换一个思路&#xff1a; 我们首先任…

AI项目二十一:视频动态手势识别

若该文为原创文章&#xff0c;转载请注明原文出处。 一、简介 人工智能的发展日新月异&#xff0c;也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式&#xff0c;在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是&#xff0c;当操作者做出…

【QT教程】QT6图形渲染与OpenGL编程

QT6图形渲染与OpenGL编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免…

写文献综述常用的几种深度神经网络模型!

写文献综述常用的几种深度神经网络模型 卷积神经网络&#xff08;CNN&#xff09; 解释说明&#xff1a;专门用于处理图像和图像数据的深度学习模型。它通过卷积层、池化层等操作提取图像特征。应用&#xff1a;图像分类、目标检测、人脸识别等。未来改进&#xff1a;进一步提…

Linux 文件管理命令sum setfacl getfacl chacl

文章目录 2.Linux 文件管理命令2.58 sum&#xff1a;计算文件的校验和&#xff0c;以及文件占用的块数案例练习 2.59 setfacl&#xff1a;设定文件访问控制列表案例练习 2.60 getfacl&#xff1a;获取文件访问控制列表案例练习 2.61 chacl&#xff1a;更改文件或目录的访问控制…

Docker使用方法

Docker是一种容器化平台&#xff0c;它可以帮助开发人员将应用程序和其依赖项打包成一个独立的、可移植的容器&#xff0c;以便在不同的环境中运行。 以下是使用Docker的基本步骤&#xff1a; 安装Docker&#xff1a;首先&#xff0c;您需要在您的机器上安装Docker。您可以从D…

Pytorch:神经网络过程代码详解

文章目录 一、基本概念1、epoch2、遍历DataLoader 二、神经网络训练过程代码详解步骤一&#xff1a;选择并初始化优化器步骤二&#xff1a;计算损失步骤三&#xff1a;反向传播步骤四&#xff1a;更新模型参数步骤五&#xff1a;清空梯度组合到训练循环中步骤六&#xff1a;保存…

windows和mac 电脑 部署Ollama

官网地址&#xff1a;https://ollama.com/ github地址&#xff1a;https://github.com/ollama/ollama 一、windows下 https://github.com/ollama/ollama 安装大模型 ollama run llama3 下载的大模型地址&#xff1a; C:\Users\dengg\.ollama 4.34G