c++的复习——多态

关于多态,有静态和动态两种多态,静态多态有模板,函数重载,静态多态相比动态,就是我在编译的时候我就知道了调用谁,函数重载简单介绍一下就是同一作用域下同一个函数名,参数顺序,个数,类型不相同,满足这种情况下就是函数重载,编译器根据参数来决定调用哪个函数,我们要注意,在两个没有继承关系的类中出现相同的参数的成员函数时,这个不是动态多态,成员函数有一个this指针,这两个类的指针是不同的,有的可能是A的this指针有的可能是B的this指针。如果此时两个有相同成员函数的类进行继承关系,此时就是函数隐藏了(其实只要函数名相同就行,参数不用管),但是还是静态多态,为什么说是函数隐藏,因为编译时我们还是知道调用的是哪个函数,在静态多态中,此时编译器编译只需要看传入的指针类型,不需要管指针指向的是哪个,根据指针类型来匹配调用的函数

动态多态就是虚函数和继承,首先说说虚函数,就是virtual关键字,在一个成员函数前面加个关键字就是虚函数了,虚函数加了,此时我们子类中会有虚函数指针,这个等会再提,此时我们调用函数时,不会看指针类型了而是看实际的对象是谁,此时虚函数指针会指向一个虚函数表,这个表中存储的是函数地址,在编译阶段时虚函数表会被构造,所有的对象共享一个虚函数表,在子类重写虚函数即在参数个数顺序和类型相同情况下重新写这个函数,重写这个函数后,虚表中的虚函数地址替换为自己的,简单点讲:

首先是father *p=new son ,p.fun()时,因为有虚函数,所以我们不知道时调用father的fun还是son的fun,需要通过指针来找,就时vptr这个虚函数指针,这个指针指向的虚函数表,可以在这个表中寻找地址,如果没有重写,此时vptr找到的就是father的fun,如果重写了就是子类的fun了,这种我们运行时才知道的叫多态

多态的用途在哪?为什么要一会调用父类一会调用子类。我是这么理解的,就拿cs这个枪战游戏说吧,我们在编写角色武器时,我们有不同的开火逻辑,awp是开一枪,伤害高,ak能连发,伤害相对低,这里我们的角色会根据不同的武器来执行不同的开火逻辑,这里就可以用多态的方式,用一个武器类作为父类,子类有多种awp,ak,a1之类的枪械,我们创造了父类指针指向子,此时对父类的开火函数fire加一个虚函数,子类重写这个虚函数,这样我们调用函数的时候会根据指针指向的对象中的vptr来决定调用哪武器开火逻辑,这是一个例子,多态可以让代码更加规范

相关推荐
2601_956121971 分钟前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
丰锋ff9 分钟前
基于 Qt 的智能门禁系统(二)
开发语言·qt
fpcc20 分钟前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
SomeB1oody35 分钟前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
mqiqe2 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim2 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情2 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学2 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484813 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python
liangshanbo12154 小时前
虚拟列表深度面试题整理
java·开发语言·前端