自己做的微信网站经常被停止访问济宁做网站的电话
「多态」作为一种编程语言概念,更广义的理解应该是「根据上下文的不同,调用相同名字的不同函数」。常见的多态包括参数化多态、Ad-hoc多态和运行时多态:
参数化多态可以理解为泛型。在泛型函数中,我们把参数和返回值的类型也当作需要填充的参数,这就造成我们看起来调用了同一个泛型函数,但实际调用的函数并不相同。
Ad-hoc多态就是函数重载,根据参数列表的不同调用不同函数版本。除此之外,运算符也可以视为一种Ad-hoc多态,比如同样的一个加号,用于两个整数和两个浮点数,就需要产生不同的代码,这也是一种多态。
拿C++举例,上面三种多态都有:通过模板实现参数化多态,通过函数重载和运算符重载实现Ad-hoc多态,通过虚函数机制实现运行时多态。
Java同样有这三种多态,但实现方式有所差别。虽然有泛型函数,但因为采用了类型擦除的方式实现,因此只针对引用类型,而且也没有针对不同类型生成不同的代码,是否属于参数化多态还存疑。
不允许重载运算符,但允许重载函数。
特别强调运行时多态,方法默认就是虚函数。
为什么要有编译时多态?
从两个角度看。为什么要有多态?一方面,我们需要简化函数的使用,一个函数能适用于多种不同的情况;另一方面也让函数调用的过程的灵活性更强,尽可能地复用代码。
为什么要在编译时分派?「分派(dispatch)」指根据一定的规则「决定」实际调用的函数,这个过程可能发生在编译时,也可能发生在运行时。对于参数化的多态和Ad-hoc多态,C++和Java都选择在编译时完成分派,这样就省略了运行时分派的开销,提高程序性能。