函数重载
- 函数重载也被成为编译时多态。
- 函数重载是在同一命名空间中,根据参数列表对同名函数的编译时绑定(resolve)。编译器根据函数调用语句的参数列表,对当前可见的同名函数进行类型检查、匹配,并绑定到拥有正确签名的函数。
函数重载的实现
- C++编译器对函数做了名称修饰(name mangling),用于支持重载。
- C对函数的名称修饰只包括函数名,C++对函数的名称修饰还涉及函数的参数列表。C++的函数
int foo(int, double)
在修饰后类似这样__foo_int_double_
- C++就是通过名称修饰来完成函数重载的。
关于类的成员函数的名称修饰
- C++编译器看待非静态成员函数的方式和普通C函数类似,只是在参数列表中增加了一个this指针,用来表明是哪一个对象调用的该成员函数。
- 对于静态成员函数,参数列表中没有this指针。
- P.S. 静态成员函数和非静态成员函数的存储位置是代码区。对对象的大小没有影响。
函数覆盖
- 这个话题有很多种说法,以下说法实际上说的都是一回事:函数覆盖 = 虚函数 = 动态绑定 = 运行时绑定 = 运行时多态
- 函数覆盖指的就是C++的虚函数机制。基类的虚函数在函数签名相同的情况下,可以被子类重写。函数覆盖的实现指的就是C++虚函数的实现。
函数覆盖的实现
- 编译器给每个有虚函数的类分配一个虚函数表。
- 每个类实例隐式地有一个且只有一个续表指针成员。
- 当运行时指针或引用去调用虚函数时,通过搜索类实例的虚表指针指向的虚表,动态绑定函数到虚表中的某个函数,这一步需要做函数签名的匹配。
网友评论