运行时多态和编译时多态

运行时多态和编译时多态

多态可以分为静多态和动多态

在这里插入图片描述

  • 静多态

静多态在编译时就确定调用函数的类型,函数重载就是一个典型的静多态

函数重载:

  1. 函数名相同
  2. 参数的个数不同,参数的类型不同,参数的顺序不同,均可构成重载
  3. 返回类型不同不可以构成重载
  4. 相同的范围 (在同一个类中)
  • 动多态

​ 在运行时才能确定调用哪个函数,动态绑定。 实际上是子类重新定义了父类的虚函数, 父类的指针就根据赋给它的不同子类的指针, 动态的调用属于子类的虚函数, 这样的函数调用在编译期无法确定。也就是覆盖

覆盖: 派生类重新定义父类中的函数, 函数名,参数列表,返回类型都必须和父类中被覆盖的函数严格一致, 只有函数体不同。

  1. 函数名相同
  2. 参数列表相同
  3. 基类函数必须有virtual关键字

隐藏 : 派生类的函数屏蔽了与其同名的基类函数。 规则如下:

  1. 如果派生类的函数名与基类的函数名相同, 但是参数不同, 此时不论有没有virtual 关键字,基类的函数将被隐藏 (注意与重载的区别)
  2. 如果派生类的函数名和参数列表都和基类的函数相同, 但是基类函数没有virtual关键字,基类的函数会被隐藏, (注意与覆盖/重写 混淆)

在这里插入图片描述

总结:

  • 运行期多态:

    • 依赖于虚函数,父类 指针在运行期通过虚函数指针以及虚函数表确定 该类虚函数的真正实现
  • 编译期多态:

    • 通过 模板具现化 和 函数重载解析实现的。 不同的模板参数具现化导致调用不同的函数。 都是在编译期间可以通过推导确定运行的函数
  • 优缺点对比:

    • 优点:
      • 运行期多态:
        • 面对对象设计, 处理一个集成体系下的多个类集合
      • 编译期多态:
        • 泛型编程概念,STL
        • 在编译期完成多态,提高运行效率
        • 具有很强适配性与松耦合性
    • 缺点:
      • 运行期多态:
        • 运行期间与虚函数绑定,增加了运行开销
        • 继承层次增大时,对接口的修改容易影响继承层次
        • 由于在运行时确定,编译器无法对虚函数进行优化
      • 编译期多态
        • 代码可读性降低,代码调试困难
        • 无法实现模板的分离编译,增加了编译时间

    参考:

C++编译期多态与运行期多态

C++ 多态详解

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃肉夹馍不要夹馍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值