美文网首页
CPP函数重载、覆盖的实现原理

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

作者: zlrs | 来源:发表于2020-03-04 17:18 被阅读0次

    函数重载

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

    函数重载的实现

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

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

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

    函数覆盖

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

    函数覆盖的实现

    • 编译器给每个有虚函数的类分配一个虚函数表。
    • 每个类实例隐式地有一个且只有一个续表指针成员。
    • 当运行时指针或引用去调用虚函数时,通过搜索类实例的虚表指针指向的虚表,动态绑定函数到虚表中的某个函数,这一步需要做函数签名的匹配。

    相关文章

      网友评论

          本文标题:CPP函数重载、覆盖的实现原理

          本文链接:https://www.haomeiwen.com/subject/voavkhtx.html