C++: 多态基本概念及原理

多态的基本概念:

多态是 C++ 面向对象三大特性之一
多态分为两类:
静态多态 : 函数重载 和 运算符重载属于静态多态,复用函数名
动态多态 : 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
静态多态的函数地址早绑定 - 编译阶段确定函数地址
动态多态的函数地址晚绑定 - 运行阶段确定函数地址
下面通过案例进行讲解多态:
//多态

//动物类

class Animal
{
public:
    //函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。
    virtual void speak()
    {
        cout << "动物在说话" << endl;
    }
};

//猫类
class Cat :public Animal
{
public:
    //重写,函数返回值类型  函数名  参数列表  完全相同

    void speak()
    {
        cout << "小猫在说话" << endl;
    }
};

//狗类
class Dog :public Animal
{
public:
    void speak()
    {
        cout << "小狗在说话" << endl;
    }
};


//执行说话的函数
//地址早绑定 编译阶段就能确定函数地址
//如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定

//动态多态满足条件
// 1、有继承关系
//2、子类重写父类的虚函数

//动态多态使用
//父类的指针或者引用 指向子类对象

void doSpeak(Animal& animal)      //Animal& animal=cat;
{
    animal.speak();
}


void test01()
{
    Cat cat;
    doSpeak(cat);

    Dog dog;
    doSpeak(dog);
}


int main() 
{
    test01();

    system("pause");
    return 0;
}

总结:
多态满足条件:
1  有继承关系
2  子类重写父类中的虚函数
多态使用条件:
父类指针或引用指向子类对象
重写:函数返回值类型 函数名 参数列表 完全一致称为重写

多态的原理刨析:

不加virtual关键字:

加virtual关键字:

为什么加上 virtual关键字之后会变成四个字节?     (指针)vfptr

写了一个虚函数,类的内部结构发生改变,多了一个指针(虚函数表指针),指向虚函数表,虚函数表的内部写的是虚函数的函数入口地址,当子类重写了虚函数,会把自身的虚函数表中的函数替换掉,替换成子类的虚函数,当用父类的引用去指向子类对象的时候,会从子类对象找函数接口入口地址。

两个类的内部结构如图如下: 

验证:

不加virtual关键字:

加virtual关键字:

当子类没有发生重写的时候:

 当子类发生重写的时候:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NewportBlakeCTF 2023(NBCTF 2023) Web方向 wp 全

一共四个web&#xff0c;非常简单的一场国际赛 Inspector Gadget 题目描述&#xff1a;While snooping around this website, inspector gadet lost parts of his flag. Can you help him find it? 开题&#xff0c;啊这 点击如下介绍&#xff0c;前1/4的flag是文章的title …

2023年哪些行业的offer发的最多?智能制造、AIGC、AI大模型位居前三

口罩过后&#xff0c;职场现状如何&#xff1f;为何211,985毕业生也找不到工作&#xff1f;哪些行业offer多多&#xff1f; 今天我以猎聘大数据《2023届高校毕业生就业数据报告》为基础&#xff0c;带大家一起来看2023年高校毕业生就业形势。热门行业岗位、18个新赛道机会、就业…

统信UOS_麒麟KYLINOS配置apt及git内网代理

原文链接&#xff1a;统信UOS/麒麟KYLINOS上配置APT和GIT内网代理 **hello&#xff0c;大家好啊&#xff01;**在企业环境中&#xff0c;出于安全和管理的考虑&#xff0c;很多公司会设置内网代理服务器&#xff0c;以控制和监管内部网络的访问。这就意味着&#xff0c;员工在使…

艾瑞:央国企数字化升级,低代码首选得帆云!

中国权威咨询机构艾瑞咨询最新发布了《2023年央国企数字化升级研究报告》。 THE NEW RESEARCH 报告认为 央国企作为中国特色社会主义的重要物质基础和政治基础&#xff0c;肩负着推动经济发展和增强社会价值的重要责任&#xff0c;必须在数字化升级中发挥引领作用。当前&#…

MySQL性能调优-1-实际优化案例

SQL优化 不要让查询优化器为难 尽量缩短寻址路程 尽量减少IO 关于SQL优化的思路&#xff0c;一般都是使用执行计划看看是否用到了索引&#xff0c;主要可能有两大类情况&#xff1a; 对业务字段建立了二级联合索引&#xff0c;但是MySQL错误地觉得走主键聚族索引全表扫描效…

内衣专用洗衣机怎么样?好用又便宜的迷你洗衣机推荐

迷你洗衣机作为一种小型便捷的家用必备洗涤设备&#xff0c;一直都受到越来越多家庭的青睐。一台迷你洗衣机可以帮助我们解决很多麻烦&#xff0c;节省我们的很多时间。对于不少在外工作的人&#xff0c;往往是一个人住&#xff0c;买一台大型的洗衣机或许有点浪费资源&#xf…

排序算法介绍(三)选择排序

0. 简介 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。选择排序是不稳…

windows 你的电脑不能投影到其他屏幕,请尝试重新安装驱动程序

注意 千万不要去下载什么驱动精灵&#xff0c;太垃圾不好用还一堆附带的软件。按以下步骤进行解决&#xff1a; 解决方法 可能是显卡驱动的问题&#xff0c;我的笔记本按照如下步骤重启一下驱动后解决了&#xff0c;步骤如下: 右键点击桌面的开始菜单&#xff0c;选择”设备…

【23-24 秋学期】NNDL 作业10 BPTT

习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度&#xff0e; 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&#xff0e; 习题6-2P 设计简单RNN模型&#xff0c;分别…

备忘录怎么传到电脑?备忘录手机电脑互传方法

对于那些记性不好的人来说&#xff0c;手机上的备忘录简直是个不可或缺的好帮手。可是有时候&#xff0c;我们在手机上记录的内容需要在电脑上查看&#xff0c;这时候该怎么办呢&#xff1f; 曾经&#xff0c;我也为备忘录的手机电脑互传问题头疼不已。手机上记录的事项&#…

CSS 局限-contain

CSS 局限 CSS 局限规范的目标在于通过允许浏览器从页面的其余部分中隔离出页面子树而改善性能。若浏览器知道页面的某一部分为独立的&#xff0c;则可优化渲染并改善性能。 此外&#xff0c;此规范允许开发者标示元素究竟是否应当渲染其内容&#xff0c;以及在屏外时是否应当…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …

如何精准操作无人机自动停机坪?

无人机自动停机坪通过自主导航和避障功能&#xff0c;实现了无人机的自主降落和起飞&#xff0c;在无人机技术领域起到了至关重要的作用。停机坪不仅仅是无人机的起降平台&#xff0c;还具备自动换电或充电等功能&#xff0c;为无人机的自动化提供了关键支持。为更有效地操作无…

LeetCode | 572. 另一棵树的子树

LeetCode | 572. 另一棵树的子树 OJ链接 我们需要判断两棵二叉树是否相同&#xff0c;如果再判断的的时候不同我们就直接返回false&#xff0c;否则就返回true然后再检查左子树和右子树里面是否存在subRoot子树~~ bool isSameTree(struct TreeNode* q, struct TreeNode* p) {…

初识谷歌chrome插件

谷歌插件想必各位都用过&#xff0c;使用广泛的vue-tools想必大家都不陌生吧&#xff0c;这就是谷歌插件。与其说是谷歌插件&#xff0c;倒不如说是浏览器插件&#xff0c;只是谷歌浏览器用的比较普遍罢了。所以这里就用谷歌插件代称吧。 1.何为插件 先来看下比较官方的定义&a…

鸿蒙基础入门与高频知识点梳理

介绍鸿蒙高频知识点&#xff0c;持续更新中 一、鸿蒙代码结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ └──Constant.ets // 常量类 │ ├──entryability │ │ └──EntryAbility.ts // 程序入口类 │ ├──p…

微信小程序自定义数据实现级联省市区组件

前言 在微信小程序中&#xff0c;官方文档提供的省市区组件&#xff0c;可以让用户更加方便快捷地选择省市区&#xff0c;但是官方提供的组件有一个缺点&#xff0c;无法自定义数据&#xff0c;但如果项目中需要使用自己的数据&#xff0c;显然就得寻找其它的组件实现。 官方组…

CTF特训日记day3

复现一下RWCTF5th shellfind题目 题目描述如下&#xff1a; Hello Hacker. You dont know me, but I know you. I want to play a game. Heres what happens if you lose. The device you are watching is hooked into your Saturday and Sunday. When the timer in the back …

颠覆性语音识别:单词级时间戳和说话人分离

vbenjs/vue-vben-admin[1] Stars: 19.7k License: MIT Vue Vben Admin 是一个免费开源的中后台模板&#xff0c;使用最新的 vue3、vite4 和 TypeScript 等主流技术进行开发。该项目提供了现成的中后台前端解决方案&#xff0c;并可用于学习参考。 使用先进的前端技术如 Vue3/…

简单可行的SeruatV4的安装方案

目前Seurat的版本从V4升级到了V5&#xff0c;由于一些变化&#xff0c;导致当年取巧&#xff0c;使用获取数据的方法都无法在V5中使用。 建议在操作前重启下Rstudio&#xff08;或更确切的说是R&#xff09;&#xff01;&#xff01;&#xff01; 那么如何确保自己能够安装V4的…