C++多态

来源:互联网 发布:海岛奇兵数据查询 编辑:程序博客网 时间:2024/06/05 05:50

前言

提到c++的多态,能想到的无非是一个接口多种方法,通过虚函数来实现的…OOP的四大特性有抽象,继承,封装,多态,作为OOP的始祖,多态可谓c++的精华,总结一下c++的多态特性的一些浅层面的理解方便日后查看。

OOP中的多态

多态(polymorphism,是指计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作称之。
多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。
–维基百科
根据其字面意思,可以理解为在程序设计中不同的表现状态。在面向对象语言中,接口的多种不同的实现方式即为多态。

C++中的多态

在c++中多态又可分为动态多态和静态多态
动态多态(dynamic polymorphism:通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态。
静态多态(static polymorphism:模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。可以用来实现类型安全、运行高效的同质对象集合操作。C++ STL不采用动态多态来实现就是个例子。
非参数化多态或译作特设多态(Ad-hoc polymorphism):
函数重载(Function Overloading
运算符重载(Operator Overloading
带变量的宏多态(macro polymorphism
参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程。
–维基百科

C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。c++中有一种编译时多态的特性-重载(overload),严格意义上这不能被称之为多态,重载是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载问题。

多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。

总结

封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

0 0
原创粉丝点击