多态(Polymorphism)按字面的意思就是“多种状态”。
在面向对象语言中,接口的多种不同的实现方式即为多态。
引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。 https://blog.csdn.net/lixungogogo/article/details/51138493
静态联编与动态联编
静态联编与动态联编(静态绑定和静态绑定)
联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息, 它 对 函 数 的 选 择 是 基 于 指 向 对 象 的 指 针 ( 或 者 引 用 ) 的 类 型 \color{red}它对函数的选择是基于指向对象的指针(或者引用)的类型 它对函数的选择是基于指向对象的指针(或者引用)的类型,其优点是效率高,但灵活性差。C语言中,所有的联编都是静态联编,据我所知道的,任何一种编译器都支持静态联编(废话)。
动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定, 动 态 联 编 对 函 数 的 选 择 不 是 基 于 指 针 或 者 引 用 , 而 是 基 于 对 象 类 型 \color{red}动态联编对函数的选择不是基于指针或者引用,而是基于对象类型 动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了。下面将介绍一下多态。动态联编的优点是灵活性强,但效率低。
C++多态有两种形式,动态多态和静态多态;动态多态是指一般的多态,是通过类继承和虚函数机制实现的多态;静态多态是通过模板、重载来实现,因为这种多态是在编译时而非运行时,所以称为静态多态。
封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。多态性可以简单地概括为“一个接口,多种方法”,最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类对象的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数,这样不会发生隐藏。
静态联编的多态——根据指针类型确定执行方法
Base类作为基类,Derive类
#include <memory>
#include <iostream>
using namespace std;
class Base
{
public:
void fun(){
cout << "Base::fun()" << endl;}
void foo(){
cout <<"Base::foo()"<<endl;}
};
class Derive: public Base
{
public:
void fun(){
cout << "Derive::fun1()" << endl;}
void foo(){
cout <<"Derive::foo()"<<endl;}
void foo(int num){
cout <<"Derive::foo("<<num<<")"<<endl;}
};
fun()
在Base与Derive中均完成了实现,参数列表相同均为空参;
foo()
在Base中实现,foo(int num)
在Derive中完成了函数重载——参数列表不同的同名函数;
int main()
{
cout<<"sizeof(Base)="<<sizeof(Base)<<endl;
cout<<"sizeof(Derive)="<<sizeof(Derive)<<endl;
Base * bpt_to_derive=new Derive