C++基础知识(七:多态)

一、多态

常说的多态,是发生在类之间的多态

函数重载(静态多态/编译时多态)

类之间的多态(动态多态/运行时多态)

【1】前提

继承是多态的前提

虚函数

什么是多态:相同的代码,实现不同的功能

【2】函数重写(override)

  1. 必须有继承关系
  2. 父类中必须有虚函数

在子类中重写父类的虚函数就是函数重写的过程,可以实现多态

【3】虚函数(virtual)

只要基类中是虚函数,后面的所有子类中该函数都是虚函数

常规来说,在继承时,给父类中的函数加上virtual关键字,定义成一个虚函数,

在子类中,可以对父类中的虚函数进行函数重写(override)

只要有虚函数的类,都会有一个虚函数表和一个虚(函数表)指针

虚指针是指向虚函数表的指针;

虚函数表,存储所有的虚函数的信息

虚函数表:保存所有虚函数的入口地址,每一个包含虚函数的类都会有一张虚函数表

如果发生继承关系,子类先复制父类的虚函数表,如果子类对某个虚函数重写,就去更改虚函数表中,该函数的入口地址

虚函数表指针:指向虚函数表的指针,父类中有一个虚函数表指针,子类中的虚函数表指针是从父类中继承下来的虚函数表指针,指向子类的虚函数表(虚函数表指针存在类中的第一个位置)

【4】虚析构函数

由于实现多态,需要使用父类的指针,指向子类的空间,父类指针可以操作的空间,只有父类自己的部分,所以,在delete父类指针时,并不会释放调子类的空间

解决方法:给基类(父类)的析构函数前面加上virtual关键字,只要基类是虚析构函数,后面继承的所有子类都是虚析构函数,虚析构函数会引导父类的指针,释放掉子类的空间

#include <iostream>using namespace std;
class Person
{public:
    string name;virtual void play(){
        cout << "吃饭" << endl;}virtual void fun(){
        cout << "fun" << endl;}virtual ~Person(){
        cout << "Person的析构" << endl;}
};class Stu:public Person
{int age;
public:void play()   //在子类中,对父类中的play进行函数重写{
        cout << "打游戏" << endl;}~Stu(){
        cout << "Stu的析构" << endl;}
};
class S:public Stu
{
public:void play(){
        cout << "第二次继承" << endl;}void fun(){
        cout << "fun的第二次继承" << endl;}
};
int main()
{//父类的指针,指向子类的空间,可以调用子类中重写的函数(多态的实现)
    Person *= new Stu;
    p->Person::play();delete p;
//    p->play();
//    Person *p1 = new S;
//    p1->play();   //第二次继承
//    p1->fun();    //fun的第二次继承
//    Person *p2 = new Stu;
//    p2->fun();    //return 0;
}

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

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

相关文章

淘宝天猫商品详情API接口(商品详情页面数据,销量接口)

淘宝商品详情API接口&#xff0c;淘宝商品销量接口&#xff0c;淘宝商品价格接口&#xff0c;淘宝商品列表接口&#xff0c;淘宝商品数据列表接口&#xff0c;淘宝关键词搜索列表接口&#xff0c;淘宝APP详情接口&#xff0c;淘宝APP商品详情接口&#xff0c;淘宝H5详情接口&am…

Python判断列表里是否有重复元素的三种方法

一、用set方法去重后与原列表长度比较 lst[1,3,5,3,4,4,2,9,6,7] set_lstset(lst) #set会生成一个元素无序且不重复的可迭代对象&#xff0c;也就是我们常说的去重 if len(set_lst)len(lst):print(列表里的元素互不重复&#xff01;) else:print(列表里有重复的元素&#xff01…

自动换刀主轴应用领域有哪些?

自动换刀主轴是一种先进的机床技术&#xff0c;能够实现快速、准确地更换刀具&#xff0c;提高加工效率和精度&#xff0c;因此在现代制造业中得到了广泛应用。 一、自动换刀主轴的应用领域 1.汽车制造业 汽车制造业是自动换刀主轴应用最广泛的领域之一。在汽车制造过程中&am…

【MySQL面试复习】什么是覆盖索引?/MySQL超大分页怎么处理?

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

护眼台灯哪个品牌质量比较好?五大优质护眼台灯推荐!

护眼台灯作为近年来最受欢迎的灯具之一&#xff0c;它不仅可以提供充足明亮的光照&#xff0c;光线环境&#xff0c;从而减少眼睛的负担和疲劳&#xff0c;还能够实现预防近视的效果&#xff0c;所以很多家长都会给孩子准备护眼台灯。但也有不少朋友觉得护眼台灯是名副其实的智…

【JavaEE】_HttpServletRequest类

目录 1. 核心方法 2. 简单方法使用实例 HttpServletRequest表示一个HTTP请求&#xff1b; 1. 核心方法 方法描述① String getProtocal()返回请求协议的名称和版本 ② String getMethod() 返回请求的HTTP方法的名称&#xff0c;如GET、POST或PUT③ String getRequestURI()从…

WampServer环境下载安装并结合内网穿透实现远程访问管理界面

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

开源MBG----renrenGenerator

目录 1.克隆项目到本地 2.编辑数据库连接 3.定义生成的代码模版 4.验证生成结果 5.多说一句 项目简介&#xff1a;人人开源项目的代码生成器&#xff0c;可在线生成entity、xml、dao、service、vue、sql代码&#xff0c;减少70%以上的开发任务。 项目地址&#xff1a;ren…

刚拿到的《HarmonyOS应用开发者高级认证》,全网整理的题目,将近300题,100%通过

刚拿到《HarmonyOS应用开发者高级认证》&#xff0c;现在把题目和答案分享一下&#xff0c;这些题目是我根据其他网站整理的&#xff0c;宁滥勿缺&#xff0c;有个别题目是重复的&#xff0c;抽半天时间看一下&#xff0c;应该是稳过的。当然建议还是先跟着文档学一下鸿蒙或者看…

看了字节跳动月薪20K+测试岗面试题,让我这个工作3年的测试工程师,冷汗直流....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在2月下旬的时候他告诉我投递了字节跳动并且简历已通过&#xff0c;2月24经…

基于Prony算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Prony算法是一种用于信号处理和系统辨识的经典方法&#xff0c;特别适用于线性时不变系统&#xff08;LTI&#xff09;的频率响应分析以及模拟复指数信号序列。其…

Python爬虫系列-获取每天黄金价格(编写爬虫的过程和编写代码思路详细解析)

最近因为经济形势不好,黄金这样的硬通货价格持续走高,而且现在已经到了相当之高的程度。介于理财投资的低迷&#xff0c;黄金的长期投资说不定可以跑赢通胀。对于我们新手的投资&#xff0c;本着低买高卖的原则&#xff0c;总不会亏太多&#xff0c;这样我们就需要一个可以每天…