C++多态语法剖析

C++的三大特性:封装,继承,多态。这三个特性中,我认为最难理解和最难学习的就是多态。这篇文章总结下多态的一些概念和语法。

多态顾名思义就是多种形态的表现手法。也就是让我们的功能能够因人而异的变化。

一.多态的两种类型

多态分为两类分别是静态多态和动态多态。

静态多态就是函数重载,运算符重载。这些其实也是多态的一种变现。

动态多态就是派生类和虚函数实现运行时多态。这也是我们C++中所指的多态。

二.静态多态和动态多态的区别

静态多态的函数地址是早就绑定好的。什么意思呢?就是在编译的时候就已经被确定下来。程序调用的时候会直接call 地址来完成功能的调用。

动态多态的函数呢地址是晚绑定,也就是在运行的时候,才确定函数地址。

如果学过Linux下的plt.got表这些概念,会对这个东西的理解会更深刻。也是一种延迟绑定的机制。

#include<iostream>
using namespace std;class Animal {
public:void Speak() {cout << "动物在说话" << endl;}
};class Cat:public Animal {
public:void Speak() {cout << "猫在说话" << endl;}
};void test01(Animal &cat) {cat.Speak();
}int main() {Cat c1;test01(c1);return 0;
}

运行结果:


这是为什么呢,因为此时的地址函数地址是固定的,你用父类去调用Speak成员函数,相应的就会找到父类的方法。那我们现在想让猫说话,如何实现呢?加入一个关键字virtual:


运行结果就变成了猫在说话。这个virtual关键字就标识了他是一个虚函数。

所以我们总结下发生多态的情况:

第一,要存在继承。

第二,父类需要发生多态的方法加入关键字virtual。那么这个函数就会变成虚函数了。编译器就不能把他当成绑定地址来编译。

第三,父类引用子类对象。就能够实现多态调用父类函数时实现子类功能。

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

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

相关文章

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及&#xff0c;越来越多的开发者和团队开始使用SVN&#xff08;Subversion&#xff09;来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程&#xff0c;帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

京东数据分析:2023年度厨房小电行业分析(厨房小电市场未来发展趋势)

酸奶机、煮蛋器、豆浆机、空气炸锅、养生壶……这些外观小巧、功能丰富、价格相对便宜的小家电&#xff0c;在过去几年间一度掀起一股“种草”风潮&#xff0c;很多年轻人认为这是精致“懒人生活”的代名词。 而在后疫情时代&#xff0c;人们的各类消费明显渐趋理性&#xff0…

深入理解多线程编程和 JVM 内存模型

目录 一、什么是多线程编程 二、JVM介绍 三、 JVM 内存模型 一、什么是多线程编程 多线程编程是一种编程方式&#xff0c;它允许程序在同一时间内执行多个线程或任务。线程是程序执行的最小单位&#xff0c;多线程编程可以将任务拆分为多个线程&#xff0c;每个线程独立执行…

如何查找设备的公共IP地址?这里提供三种方法

每个以某种方式连接到互联网的设备都有一个IP地址。这是你的设备使用的唯一标识符,可以被互联网或本地网络上的其他设备识别。 如果你使用的是直接连接到互联网的智能手机或平板电脑等设备,你的公共IP地址将由你的移动运营商直接分配。 另一方面,如果你使用的是连接到本地…

C++: vector

目录 1.vector的介绍 2.vector常用的接口 1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样&#xff1f; 1.vector的介绍 C中的vector是一个动态数组容器&#xff0c;可以存储任意类型的…

数据库安装

数据库相关概念 在这一部分&#xff0c;我们先来讲解三个概念&#xff1a;数据库、数据库管理系统、SQL。 数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管 理系统操纵和管理数据库的大型软件DataBase Management System…

【MATLAB基础绘图第20棒】云雨图

MATLAB绘制云雨图 云雨图(Raincloud plots)MATLAB绘制云雨图横向云雨图竖向云雨图 参考 云雨图(Raincloud plots) 云雨图&#xff08;Raincloud plots&#xff09;其实是可以看成核密度估计曲线图、箱形图和抖动散点图的组合图&#xff0c;清晰、完整、美观地展示了所有数据信…

jdk的安装和Tomcat的安装

jdk的安装 双击jdk&#xff0c;然后一路下一步 公共JRE可以关闭&#xff0c;没多大用&#xff0c;反而会占用内存 计算机–>属性–>高级系统设置–>环境变量 系统变量–新建 JAVA_HOMEjdk的存放路径 修改path 在path的最后面添加&#xff08;&#xff1b;%JAVA_H…

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

开源的测试平台快2千星了,能带来多少收益呢

最近看了下自己去年初开源的测试平台&#xff0c;star一起算的话也到1.7k了&#xff1a; 做开源的初心一方面是想把自己的理解和思想展示出来&#xff0c;另一方面是想进一步打造个人IP&#xff0c;提升影响力&#xff08;其实这个想法很早之前就有了&#xff0c;计划过无数次但…

蓝桥杯重要知识点和赛题直通车

<蓝桥杯软件赛>零基础备赛20周 第 1周(2023-10-23): 蓝桥杯软件赛介绍官方链接零基础能得奖吗&#xff1f; 第 2周(2023-10-30): 常考知识点蓝桥杯怎么判题备赛计划 第 3周(2023-11-06): 填空题&#xff08;分数少但越来越不好做&#xff09; 第 4周(2023-11-13): &#…