首先来看看百度百科的联编定义:
联编是指一个计算机程序自身彼此关联(使一个源程序经过编译、连接,成为一个可执行程序)的过程,在这个联编过程中,需要确定程序中的操作调用(函数调用)与执行该操作(函数)的代码段之间的映射关系,按照联编所进行的阶段不同,可分为静态联编和动态联编。
静态联编
静态联编又称静态束定、早期联编、前期联编。
静态联编是指联编工作是在程序编译连接阶段进行的,静态联编又称早期联编,因为这种联编是在程序开始运行之前完成的。在程序编译阶段进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又被称为束定,编译时束定又称为静态束定。
调用速度快,效率高。
动态联编
动态联编又称动态关联、动态束定、后期联编、晚期联编。
动态联编是指编译程序在编译阶段并不能确切地知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行,这种在程序运行时进行的联编工作被称为动态联编。C++规定:动态联编是在虚函数的支持下实现的。
动态联编必须包括以下方面:
1、成员函数必须声明为virtual
调用方式:
通过对象的指针或引用调用成员函数,或通过成员函数调用,反之就无法实现动态联编。
灵活,问题抽象性和问题的易维护性。
百度百科真是越写越好了,继续加油。
动态联编在运行时确定了使用基类还是子类的函数,这就是C++实现多态的手段。从本质上来讲,多态是想是实现模板编程,这种思想在我看来既能说是面向对象的特征,也可以说是一种新的编程思路。尽可能的实现代码复用,或者说是一个方法名称实现某一种类似行为。
#include<iostream>
using std::cout;
using std::endl;
class Parent
{
public:
virtual void show() //虚函数show
{
cout << "parent" << endl;
}
};
class Son : public Parent
{
public:
void show()
{
cout << "son" << endl;
}
};
void fun(Parent& p)
{
p.show();
}
int main()
{
Parent* p = nullptr;
p = new Son;
Parent p1;
fun(p1); //父类
fun(*p); //子类
delete p;
p = nullptr;
return 0;
}
fun的参数是p1的时候,将会调用父类的show函数,而参数是*p的时候会调用子类的show函数。这就动态联编,这运行的时候确定是哪一个函数。
作为参照,我们来看看静态联编的效果。
#include<iostream>
using std::cout;
using std::endl;
class Parent
{
public:
virtual void show() //虚函数show
{
cout << "parent" << endl;
}
void put()
{
cout << "基类" << endl;
}
};
class Son : public Parent
{
public:
void show()
{
cout << "son" << endl;
}
void put()
{
cout << "派生类" << endl;
}
};
void fun(Parent& p)
{
p.show();
}
void fun(Parent& p,int) //使用占位参数重载fun。
{
p.put();
}
int main()
{
Parent* p = nullptr;
p = new Son;
Parent p1;
fun(p1); //父类
fun(*p); //子类
cout << endl;
fun(p1, 1); //父类
fun(*p, 1); //子类
delete p;
p = nullptr;
return 0;
}
结果如下:
很明显,静态联编在编译的时候就和被调函数绑定了,只会去调用基类的put成员函数,根本不会调用派生类重写的put成员。
基类一般把派生类需要重定义的任意函数定义为虚函数。
除了构造函数和static成员函数之外,其余的函数都可以被virtual修饰成为虚函数。
一旦有了虚函数,那么就将发生多态。