多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具备多种形式或形态的情形。在程式设计领域,一个广泛认可的定义是“一种将不同的特别行为和单个泛化记号相关联的能力”。和纯粹的面向对象程式设计语言不同,C 中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,模板也允许将不同的特别行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(static polymorphism)。
事实上,带变量的宏和函数重载机制也允许将不同的特别行为和单个泛化记号相关联。然而,习惯上我们并不将他们展现出来的行为称为多态(或静态多态)。今天,当我们谈及多态时,假如没有明确所指,默认就是动态多态,而静态多态则是指基于模板的多态。但是,在这篇以C 各种多态技术为主题的文章中,我们首先还是回顾一下C 社群争论已久的另一种“多态”:函数多态(function polymorphism),连同更不常提的“宏多态(macro polymorphism)”。
函数多态
也就是我们常说的函数重载(function overloading)。基于不同的参数列表,同一个函数名字能够指向不同的函数定义:
| // overload_poly.cpp #include <iostream> #include <string> // 定义两个重载函数 int my_add(int a, int b) { return a b; } int my_add(int a, std::string b) { return a atoi(b.c_str()); } int main() { int i = my_add(1, 2); // 两个整数相加 int s = my_add(1, "2"); // 一个整数和一个字符串相加 std::cout << "i = " << i << "\n"; std::cout << "s = " << s << "\n"; } |
根据参数列表的不同(类型、个数或兼而有之),my_add(1, 2)和my_add(1, "2")被分别编译为对my_add(int, int)和my_add(int, std::string)的调用。实现原理在于编译器根据不同的参数列表对同名函数进行名字重整,而后这些同名函数就变成了彼此不同的函数。比方说,也许某个编译器会将my_add()函数名字分别重整为my_add_int_int()和my_add_int_str()。




