天天看点

C++ 多态1、概述2、静态多态3、动态多态4、比较5、其它

1、概述

之前感觉对多态了解的挺深入的,任何多态的问题都难不倒我,然后我发现有静态多态的概念,一下子就懵掉了。所以有时候不要太自信,多看看就很容易碰到自己的只是盲区,趁着这个机会,把多态的内容给整理一下。

多态:即多种形态,调用同一种方法,不同的类型,会有不同状态的操作。

C++ 里面的多态可以分为:静态多态和动态多态。静态多态很容易理解,就是编译时就知道的重载;动态多态是需要在运行期确定的。

C++ 多态1、概述2、静态多态3、动态多态4、比较5、其它

2、静态多态

静态多态就是编译时期的多态。静态多态又可以分为:函数重载和泛型编程。

函数重载,学习C++都知道,在相同作用域中,函数名相同,参数的数目或者顺序不同的函数构成重载。在函数使用时,我们可以调用任何一个函数,编译器会根据我们传入的参数来定位实际上调用的函数。

泛型编程,其实就是定义模板函数,在实际使用时,通过传入不同的类型,编译器对其具象化。因为是编译器时期进行的操作,所以是静态多态。

3、动态多态

之前在整理虚函数的原理时,我们讲过多态实现的具体原理。这里进行简单的描述:

1、基类中使用关键字virtual声明虚函数

2、只要类中有虚函数,类对象在构造的时候,编译器会给这个对象生成一个虚函数指针vptr

3、虚函数指针指向一个表,此表记录着此类中所有虚函数的地址

4、如果派生类对基类的虚函数进行重写,则派生类会对此类虚函数表中的相应地址进行修改

5、使用基类的指针或者引用派生类的对象,则对象中虚指针指向派生类的虚函数表

6、使用时,会根据虚函数表中的地址,动态的加载相应的函数

7、如果直接使用基类对象,则会发生切割行为,虚函数表也是基类的虚函数表数据。

动态多态需要三个条件:继承、虚函数、指向基类的指针或引用,这三者缺一个都构不成动态多态。

4、比较

静态多态是在编译器完成,因此效率较高,编译器也可以进行优化。有很强的适配性和松耦合性。

动态多态是运行期确定的,需要一定时间的开销,而且编译器无法对其进行优化。但是它是面向对象的设计,可以把实现和接口分离,可以复用,处理同一继承体系下的对象集合威力强大。

5、其它

还听过一种:通用多态和专有多态。

通用多态又可以分为:参数多态(模板)和 包含多态(虚函数)

专有多态又可以分为:重载多态和强制多态。

我也不知道这些个概念是怎么来的,也不知道正确性,详细内容需要大家自行查资料了。

感谢大家,我是假装很努力的YoungYangD(小羊)。

继续阅读