什么是多态?
多态可以简单地概括为,一个接口,多种方法,在程序运行过程中才调用的函数。多态是面向对象编程的重要的核心概念之一。
polymorphisn允许你将父对象设置为和它的一个或更多的子对象相等的技术,赋值之后,父对象可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单地说就是允许子类类型的指针赋值给父类类型的指针。多态在object pascal和C++中都是通过虚函数virtual function实现的。
虚函数是允许被其子类重新定义的成员函数,而子类重新定义父类虚函数的做法成为覆盖,override。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针动态地调用属于子类的该函数。那么这样的函数在编译期间是无法确定的,调用的子类虚函数地址无法在编译时给出。这样的函数地址是运行时绑定的,(晚绑定)。如果不是晚绑定,就不是多态!
而重载是指允许多个同名函数,而这些函数的参数表不同(参数个数不同,类型不同或者二者均不同)。其实重载的概念不属于面向对象编程,它是编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。对这样的函数的调用,在编译期间就确定了,也就是说是静态的,函数地址在编译时就绑定了(早绑定)。
那么多态的作用是什么呢?
封装可以隐藏实现细节,使代码模块化;继承可以扩展已存在的代码模块(类);二者都实现了代码重用。
而动态则实现了接口重用,因为设计接口比用一堆类来实现这个接口更费时间,而且接口需要耗费更昂贵的人力和时间”“。