关于多态,有静态和动态两种多态,静态多态有模板,函数重载,静态多态相比动态,就是我在编译的时候我就知道了调用谁,函数重载简单介绍一下就是同一作用域下同一个函数名,参数顺序,个数,类型不相同,满足这种情况下就是函数重载,编译器根据参数来决定调用哪个函数,我们要注意,在两个没有继承关系的类中出现相同的参数的成员函数时,这个不是动态多态,成员函数有一个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来决定调用哪武器开火逻辑,这是一个例子,多态可以让代码更加规范