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来决定调用哪武器开火逻辑,这是一个例子,多态可以让代码更加规范

相关推荐
geovindu2 小时前
go: Prototype Pattern
开发语言·设计模式·golang·原型模式
草莓熊Lotso2 小时前
手搓工业级 C++ 线程安全日志系统:基于策略模式解耦,兼容 glog 使用风格
linux·运维·服务器·数据库·c++·安全·策略模式
pearlthriving2 小时前
STL容器及其底层
开发语言·c++·算法
chao1898442 小时前
具有飞行约束的无人机MPC MATLAB实现
开发语言·matlab·无人机
Byte不洛2 小时前
深入理解C++多态机制:虚函数、虚表与对象内存模型解析
c++·多态·对象模型·虚函数表·虚基表
leaves falling2 小时前
C++ 继承详解:从入门到深入
开发语言·c++
minji...2 小时前
Linux 网络基础(一)认识协议,网络协议,网络协议分层框架搭建,网络传输基本流程,跨网络的数据传输
linux·运维·服务器·网络·c++·网络协议
草木红2 小时前
Python 中使用 Docker Compose
开发语言·python·docker·flask
吃着火锅x唱着歌2 小时前
深度探索C++对象模型 学习笔记 第四章 Function语意学(1)
c++·笔记·学习