zoukankan      html  css  js  c++  java
  • C++多态的实现与局限性

    1、什么是多态?

      父类指针指向子类对象,运行时期调用方法的时候,根据方法拥有者的真实类型,确定调用哪个方法。

    2、如何实现多态?

      要实现多态,需要加一个中间层,暴露父类的方法,内部根据指针的真实类型决议方法。

      C++多态的实现方法是:每个类对应一个虚方法表vtbl,子类把父类的虚方法整体拷贝一份,对于重写的虚方法进行置换,换成重写后的方法。每个类对象内有一个vptr指向本类的虚方法表,无论父类对象还是子类对象,vptr都在相同位置。也就是说,即使编译器把子类对象当成父类对象来解释,也是没有问题的,在同样位置可以找到vptr,然后调用相应的方法。

    3、显而易见,C++实现多态,要求每个类都有一张虚方法表,子类虚方法表与父类虚方法表的关系是:要么继承,要么重写,要么新增。通过父类指针不能访问新增的虚方法。这种方式的优点是:因为每个虚方法的位置都定下来了,直接可以定位找到对应方法,速度快。缺点是:对于继承的虚方法(实际上是虚方法指针)要重复存储,浪费空间。考虑一种极端的情况:一个父类有100个方法,子类重写一个方法,在子类的虚方法表中只有一个重写,其他都是继承,如果继承层次结构繁多,就会大量浪费内存。

    4、有没有更好的办法呢?

      最容易想到的是:子类的方法表中只保留重写的方法,对于继承的方法不再存储,而是引用父类的方法。但是,这有一个问题,那就是方法的位置不确定了,必须遍历才能找到方法,时间效率低。时间效率低,可以使用哈希表来解决,直接定位方法的位置。

      还有一种办法是:不使用虚方法。在类中保留一个方法指针,方法形参是该类的对象。对于不同的对象赋值给不同的方法。

  • 相关阅读:
    APP 元素定位总结(未完待补充)
    vue-axios常见请求配置和全局设置
    vue-axios发送并发请求
    vue-axios基本使用
    vue-vuex-store目录结构
    vue-vuex-modules的基本使用
    vue-vuex-actions的基本使用
    vue-vuex-mutations的类型常量
    vue-vuex-state响应式
    vue-vuex-mutation的提交风格
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3477352.html
Copyright © 2011-2022 走看看