联编与多态(编译时多态和运行时多态)

联编

在函数调用时,系统必须知道函数调用实际对应的函数实现(函数体)的地址,并把调用跟函数入口地址关联起来。这个过程称为联编,也叫作绑定(binding)。

在编译的时候就能够确定函数的入口地址,这种联编方式叫做静态联编。由于这个过程是在编译时完成的,早于程序的执行,所以又叫做早期绑定/早期联编。我们最初使用(非虚函数)的无论是普通的全局函数,还是作为类成员的成员函数,或是运算符虫子啊函数或者其他重载函数等,都能够在编译时确定其入口地址,采用的是静态联编方式。


编译时多态(静态多态)

联编对于实现多态至关重要。多态实际上就是一个函数调用对应不同的函数体实现。重载的多个函数具有相同的函数名,但是拥有不同的形参列表。这样在函数调用时,编译器能够根据传给函数的实际参数来跟重在函数进行匹配,根据一定的规则找到最佳的匹配函数版本后再调用。这样一个函数名实际对应的是多个不同的函数实现。这就是一种多态的方式。由于这种多态在编译的时候就能确定所调用的函数并进行绑定,所以称为编译时多态


运行时多态(动态多态)

编译器在编译程序时不能确定所要调用的函数入口地址,而只能在运行时确定所调用的函数的实际地址并加以绑定。由于这种绑定发生在程序运行的时候,而不是编译的时候,所以叫做动态绑定,也叫作延迟绑定。程序运行时,同名的函数调用会绑定到不同的函数实现代码上,而且这种对应只能在运行时确定,这种多态方式叫做运行时多态。运行时多态是通过继承和虚函数,在程序执行时动态绑定实现的。一般意义上的多态指的是运行时多态。实现多态的基本手段是虚函数。


区别

函数重载处理的是同一层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题,前者是横向重载,后者可以理解为纵向重载。

由于编译时多态是在编译的时刻就确定了需要绑定的函数,不需要程序执行的时候调用函数的匹配,所以速度快,程序执行效率高。而运行时多态则需要在程序执行的时候才能从多个同名的函数中确定调用的具体函数,所以执行效率不高。但是运行时多态提供了程序设计灵活的拓展性、问题的抽象性和代码的可维护性等优点,实际使用也很多,而且也是C++面向对象设计的非常重要的手段之一。


摘自:李刚《C++编程——面向问题的设计方法》

猜你喜欢

转载自blog.csdn.net/owen7500/article/details/52431173