CPP函数重载、覆盖的实现原理

函数重载

  • 函数重载也被成为编译时多态。
  • 函数重载是在同一命名空间中,根据参数列表对同名函数的编译时绑定(resolve)。编译器根据函数调用语句的参数列表,对当前可见的同名函数进行类型检查、匹配,并绑定到拥有正确签名的函数。

函数重载的实现

  • C++编译器对函数做了名称修饰(name mangling),用于支持重载。
  • C对函数的名称修饰只包括函数名,C++对函数的名称修饰还涉及函数的参数列表。C++的函数int foo(int, double)在修饰后类似这样__foo_int_double_
  • C++就是通过名称修饰来完成函数重载的。

关于类的成员函数的名称修饰

  • C++编译器看待非静态成员函数的方式和普通C函数类似,只是在参数列表中增加了一个this指针,用来表明是哪一个对象调用的该成员函数。
  • 对于静态成员函数,参数列表中没有this指针。
  • P.S. 静态成员函数和非静态成员函数的存储位置是代码区。对对象的大小没有影响。

函数覆盖

  • 这个话题有很多种说法,以下说法实际上说的都是一回事:函数覆盖 = 虚函数 = 动态绑定 = 运行时绑定 = 运行时多态
  • 函数覆盖指的就是C++的虚函数机制。基类的虚函数在函数签名相同的情况下,可以被子类重写。函数覆盖的实现指的就是C++虚函数的实现。

函数覆盖的实现

  • 编译器给每个有虚函数的类分配一个虚函数表。
  • 每个类实例隐式地有一个且只有一个续表指针成员。
  • 当运行时指针或引用去调用虚函数时,通过搜索类实例的虚表指针指向的虚表,动态绑定函数到虚表中的某个函数,这一步需要做函数签名的匹配。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C++类和对象 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心...
    863cda997e42阅读 3,907评论 0 4
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,201评论 0 50
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 8,028评论 1 5
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 10,440评论 0 14
  • 人,为什么要学习?因为,学习能力是一生中最重要的能力。 所有人获得知识的最基本手段是体验,所谓体验,通俗的说就是来...
    古月一品包阅读 2,405评论 0 0