多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口.
多态分为动态动态和静态多态.
动态联编(动态多态)
编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。
在C++中,运行时多态性是通过虚函数来实现的。
- 定义: 同一操作作用于不同的对象,产生不同的执行结果。意味着当调用虚成员函数时,会根据调用类型对象的实际类型执行不同的操作。
- 实现:通过虚函数实现,用virtual声明的成员函数就是虚函数,允许子类重写。声明基类的指针或者引用指向不同的子类对象,调用相应的虚函数,可以根据指针或引用指向的子类的不同从而执行不同的操作。
对于类的多态性,一定是基于虚函数表的,那么虚函数表的实现一定是动态联编的,因此也不可缺少虚函数指针寻址的过程,那么我们要实现动态联编,就需要用到指针或者引用的形式。
静态联编(静态多态)
在编译时所进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系。
在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。
特设多态
函数重载属于一种多态,叫做特设多态(Ad hoc polymorphism)。特设多态的意思是,一个函数有,有限数量的多种不同的实现,依赖参数的类型来选择调用特定版本的函数实现。这种选择在编译期就可以判断,所以称为静态多态。 C++ 里的函数重载和运算符重载都是 特设多态。
参数多态
参数多态就是定义类型时候,或者某个类型的实现时候(比如类,函数,变量等)保留类型参数,等以后在使用时候,由程序员或者编译器补上适当的类型参数。有时候也会被叫做泛型编程。一般这也是编译期决定的,也是静态多态 B 是 A 的子类型(分为名义子类型和结构子类型,名义子类型就是必须显式声明子类型关系,结构子类型就是只要满足接口一致就自动实现了子类型关系),所有使用 A 的地方我们都可以用 B 去安全替换上 。
包含多态
包含多态就是,同样的操作,我们可以作用于 A 和 A 的所有子类型(比如B)上。在包含多态中,由于值是不定类型的,可能是任何的子类型,实现也可能是任意子类型中配套的任意实现,我们编译期拿不到足够的信息,所以需要运行时通过动态分派查找具体的类型对应的实现(比如 C++ 的 VTable 和 JavaScript 的原型链),所以包含多态是动态多态。
多态、重写、重载的区别
- 多态(狭义上的):同一个方法对不同的对象调用行为不同的现象。
- 重写:同一方法在不同类中的重新实现。
- 重载:不同的方法。