C++特性三:多态的基本语法及原理剖析

一、多态的基本语法

多态分为两类

静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名

动态多态: 派生类和虚函数实现运行时多态

静态多态和动态多态区别:

静态多态的函数地址早绑定 - 编译阶段确定函数地址

动态多态的函数地址晚绑定 - 运行阶段确定函数地址

#include<iostream>
using namespace std;//多态//动物类
class Animal
{
public://虚函数virtual void speak()//void speak(){cout << "动物在说话" << endl;}
};//猫类
class Cat :public Animal
{
public://重写:函数返回值类型 函数名 参数列表 完全相同称为重写void speak()//子类重写时,前面virtual可写可不写{cout << "小猫在说话" << endl;}
};//狗类
class Dog :public Animal
{
public:void speak(){cout << "小狗在说话" << endl;}
};//执行说话的函数
//地址早绑定	在编译阶段确定函数地址
//如果想执行让猫会说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定
//在动物类speak函数前加virtual//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数//动态多态使用
//父类的指针或者引用指向子类对象void doSpeak(Animal &animal)	//Animal &animal = cat
{animal.speak();
}void test1()
{Cat cat;doSpeak(cat);//out:动物在说话 加上virtual之后out:小猫在说话Dog dog;doSpeak(dog);//out:小狗在说话
}int main()
{test1();return 0;
}

总结:

多态满足条件:

1.有继承关系

2.子类重写父类中的虚函数

多态使用条件: 父类指针或引用指向子类对象

重写:函数返回值类型 函数名 参数列表 完全一致称为重写

二、多态的原理剖析

1.未发生重写时,则为继承,把父类中的所有内容都继承一份

2.发生重写时 ,子类中的虚函数表内部会替换成子类的虚函数地址

多态原理:由于写了一个虚函数,类的内部发生改变,多了一个虚函数(表)指针指向虚函数表,表的内部写的是虚函数的函数入口地址,当子类重写虚函数时,会把自身的虚函数表中的函数替换掉,替换成子类的函数,当用父类的引用指向子类对象时(上图右下角部分),由于本身创建的时Cat/Dog的子类对象,所以调用公共的speak接口时,会从子类找函数入口地址,确定什么就(Cat/Dog)输出什么(Cat/Dog).

代码部分:(只增加了一个测试函数 )

#include<iostream>
using namespace std;//多态//动物类
class Animal
{
public://虚函数virtual void speak()//void speak(){cout << "动物在说话" << endl;}
};//猫类
class Cat :public Animal
{
public://重写:函数返回值类型 函数名 参数列表 完全相同称为重写void speak()//子类重写时,前面virtual可写可不写{cout << "小猫在说话" << endl;}
};//狗类
class Dog :public Animal
{
public:void speak(){cout << "小狗在说话" << endl;}
};//执行说话的函数
//地址早绑定	在编译阶段确定函数地址
//如果想执行让猫会说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定,地址晚绑定
//在动物类speak函数前加virtual//动态多态满足条件
//1.有继承关系
//2.子类重写父类的虚函数//动态多态使用
//父类的指针或者引用指向子类对象void doSpeak(Animal &animal)	//Animal &animal = cat
{animal.speak();
}void test1()
{Cat cat;doSpeak(cat);//out:动物在说话 加上virtual之后out:小猫在说话Dog dog;doSpeak(dog);//out:小狗在说话
}void test2()
{cout << "sizeof Animal = " << sizeof(Animal) << endl;//未加virtual:1,加上virtual:4
}int main()
{//test1();test2();return 0;
}

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

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

相关文章

【Python】使用selenium对Poe批量模拟注册脚本

配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…

keithley2612A数字源表

181/2461/8938产品概述&#xff1a; Keithley 2612A源表既可用作台式I-V表征工具&#xff0c;也可用作多通道I-V测试系统的构建模块组件。对于台式使用&#xff0c;吉时利2612ASourceMeter具有嵌入式TSP Express软件工具&#xff0c;允许用户快速轻松地执行常见的I-V测试&…

微信小程序开发学习笔记——4.2showModal和showLoading界面交互操作

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p27&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showModal 显示模态对话框 1、属性 https:/…

基于springboot+vue的摄影网站(源码+部署说明+系统介绍+数据库)

作者主页&#xff1a;Java程序员老张 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;…

SSTI漏洞详解

目录 前备知识 模块引擎&#xff1a; 模块渲染函数&#xff1a; 继承关系&#xff1a; SSTI漏洞简介 SSTI漏洞成因 SSTI漏洞原理 一些常见模块介绍 php Twig模块引擎 代码演示1 Twig模块引擎代码演示2 python flask模块 代码演示1&#xff1a; python jinja模块 代…

深入理解Java并发工具包中的CyclicBarrier

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java的并发编程世界中&#xff0c;协调和管理多个线程的执行是一项复杂而关键的任务。为了简化这一挑战&#xff0c;Java并发包…

数据分析-Pandas序列滑动窗口配置参数

数据分析-Pandas序列滑动窗口配置参数 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

初探Springboot 参数校验

文章目录 前言Bean Validation注解 实践出真知异常处理 总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 前言 工作中我们经常会遇到验证字段是否必填&#xff0c;或者字段的值是否…

极客早报第3期:罗斯否认插足凯特王妃婚姻;清明放假调休3天;国产伟哥去年销售近13亿

一分钟速览新闻点&#xff01; 每日简报 罗斯否认插足凯特王妃婚姻清明放假调休3天国产伟哥去年销售近13亿男子持台球杆殴打2名女店员被抓今日春分淀粉肠小王子带货日销售额涨超10倍[高中生被打伤下体休学 邯郸通报](https://www.baidu.com/s?wd高中生被打伤下体休学 邯郸通报…

ARM Cortex-R82处理器在压缩SSD场景的应用

ScaleFlux公司宣布在其下一代企业级SSD控制器产品线中采用Arm公司的Cortex-R82处理器。这一决策旨在应对企业环境中对高带宽存储解决方案日益增长的需求&#xff0c;并通过提升数据传输速度和效率来满足市场期待。 Arm Cortex-R82处理器是Arm公司迄今为止性能最强的实时处理器…

STC 51单片机烧录程序遇到一直检测单片机的问题

准备工作 一&#xff0c;需要一个USB-TTL的下载器 &#xff0c;并安装好对应的驱动程序 二、对应的下载软件&#xff0c;stc软件需要官方的软件&#xff08;最好是最新的&#xff0c;个人遇到旧的下载软件出现问题&#xff09; 几种出现一直检测的原因 下载软件图标&#xf…

Unbuntu20.04 git push和pull相关问题

文章目录 Unbuntu20.04 git push和pull使用&#xff11;&#xff0e;下载[Git工具包](https://git-scm.com/downloads)&#xff12;&#xff0e;建立本地仓库&#xff13;&#xff0e;将本地仓库与github远程仓库关联&#xff14;&#xff0e;将本地仓库文件上传到github远程仓…

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机 SV-J4G 是一款企业级彩屏网络电话&#xff0c;具有高清语音&#xff0c;320x240 2.8英寸彩屏&#xff0c;支持千兆以太网&#xff0c;12个SIP账号&#xff0c;支持PoE供电&#xff0c;支持外接EHS无线耳机&#xff0c;三方电话会…

Grok-1:参数量最大的开源大语言模型

Grok-1&#xff1a;参数量最大的开源大语言模型 项目简介 由马斯克领衔的大型模型企业 xAI 正式公布了一项重要动作&#xff1a;开源了一个拥有 3140 亿参数的混合专家模型&#xff08;MoE&#xff09;「Grok-1」&#xff0c;连同其模型权重和网络架构一并公开。 此举将 Gro…

清华大模型ChatGLM3部署初体验

正文共&#xff1a;1555 字 17 图&#xff0c;预估阅读时间&#xff1a;2 分钟 ChatGLM3是智谱AI和清华大学KEG实验室联合发布的对话预训练模型。该项目在GitHub的工程链接为&#xff1a; https://github.com/THUDM/ChatGLM3 在人工智能领域中&#xff0c;类似“3B”、“6B”、…

C++--STL标准库

一.模板 模板是C中泛型编程的基础。一个模板就是一个创建类或函数的蓝图。 生活中常见的模板有: 编写一个比较两个值大小的函数&#xff0c;如果第一个值大于第二个值返回大于0的数字,两个值相等返回0,第一个值小于第二个值返回小于0的数字。 我们可以根据值类型定义多个函数&…

Go语言实战:深入掌握标准库flag的强大用法

Go语言实战&#xff1a;深入掌握标准库flag的强大用法 引言flag库基础命令行参数的基本概念使用flag库定义和解析命令行参数处理非选项命令行参数小结 高级用法自定义Flag的解析命令行参数的分组和嵌套小结 实战技巧组织复杂命令行应用的参数错误处理和用户帮助信息调试命令行应…

php基于人工智能预警突发疾病系统python-flask-django-nodejs

根据现实需要&#xff0c;此系统我们设计出一下功能&#xff0c;主要有以下功能模板。 前台功能&#xff1a;首页、医生、疾病知识、后台管理。 医生功能&#xff1a;首页、个人中心、咨询信息管理、疾病预警管理、高血压管理、糖尿病管理。 用户功能&#xff1a;首页、个人中心…

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…

SinoDB客户端工具dbaccess

类似Oracle的客户端工具sqlplus&#xff0c;Mysql的客户端工具mysql&#xff0c;SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入&#xff0c;将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行&#xff0c;然后接收服务器的执行结果&#xf…