C++ 多态

1、概述

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

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

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

2、静态多态

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

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

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

3、动态多态

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

1、基类中使用关键字virtual声明虚函数
2、只要类中有虚函数,类对象在构造的时候,编译器会给这个对象生成一个虚函数指针vptr
3、虚函数指针指向一个表,此表记录着此类中所有虚函数的地址
4、如果派生类对基类的虚函数进行重写,则派生类会对此类虚函数表中的相应地址进行修改
5、使用基类的指针或者引用派生类的对象,则对象中虚指针指向派生类的虚函数表
6、使用时,会根据虚函数表中的地址,动态的加载相应的函数
7、如果直接使用基类对象,则会发生切割行为,虚函数表也是基类的虚函数表数据

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

4、比较

静态多态是在编译器完成,因此效率较高,编译器也可以进行优化。有很强的适配性和松耦合性。
动态多态是运行期确定的,需要一定时间的开销,而且编译器无法对其进行优化。但是它是面向对象的设计,可以把实现和接口分离,可以复用,处理同一继承体系下的对象集合威力强大。

5、其它

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

通用多态又可以分为:参数多态(模板)和 包含多态(虚函数)
专有多态又可以分为:重载多态强制多态

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值