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…

【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;当操作者做出…

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

写文献综述常用的几种深度神经网络模型 卷积神经网络&#xff08;CNN&#xff09; 解释说明&#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

二维数组-----刷题2

题目不是傻子题目&#xff0c;但很简单&#xff01;定义一个变量k&#xff0c;在嵌套中不断累加输出即可。 #include<cstdio> int k,n; int main(){scanf("%d",&n);for(int i1;i<n;i){for(int j1;j<n;j){k;printf("%d ",k);}printf("…

Python基础学习之记录中间文件

倘若想记录代码运行过程中的结果文件&#xff0c;那么以下函数仅供参考 代码示例&#xff1a; import os import datetime import sys import pandas as pd# 定义总的文件夹路径 base_folder E:\\D\\log\\product_data_compare_log# 定义一个函数来创建带时间戳的文件夹 def…

【Godot4.2】有序和无序列表函数库 - myList

概述 在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式&#xff0c;输出带序号或前缀字符的多行文本。 为此我专门设计了一个类myList&#xff0c;来完成这项任务。 代码 以下是myList类的完整代码&#xff1a; # …

SQL Sever无法连接服务器

SQL Sever无法连接服务器&#xff0c;报错证书链是由不受信任的颁发机构颁发的 解决方法&#xff1a;不用ssl方式连接 1、点击弹框中按钮“选项” 2、连接安全加密选择可选 3、不勾选“信任服务器证书” 4、点击“连接”&#xff0c;可连接成功

python安卓自动化pyaibote实践------学习通自动刷课

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文是一个完成一个自动播放课程&#xff0c;避免人为频繁点击脚本的构思与源码。 加油&#xff01;为实现全部电脑自动化办公而奋斗&#xff01; 为实现摆烂躺平的人生而奋斗&#xff01;&#xff01;&#xff…

视觉语言模型详解

视觉语言模型可以同时从图像和文本中学习&#xff0c;因此可用于视觉问答、图像描述等多种任务。本文&#xff0c;我们将带大家一览视觉语言模型领域: 作个概述、了解其工作原理、搞清楚如何找到真命天“模”、如何对其进行推理以及如何使用最新版的 trl 轻松对其进行微调。 什…

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…