联编是指一个计较机措施自身互相关联的进程。凭据联编所举办的阶段差异,可分为两种差异的联编要领:静态联编和动态联编。
静态联编
静态联编是指联编事情呈此刻编译毗连阶段,这种联编又称早期联编,因为这种联编进程是在措施开始运行之前完成的。
在编译时所举办的这种联编又称静态束定。在编译时就办理了措施中的操纵挪用与执行该操纵代码间的干系,确定这种干系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#include
class Point
{
public:
Point(double i, double j) { x=i; y=j; }
double Area() const { return 0.0; }
private:
double x, y;
};
class Rectangle:public Point
{
public:
Rectangle(double i, double j, double k, double l);
double Area() const { return w*h; }
private:
double w, h;
};
Rectangle::Rectangle(double i, double j, double k, double l):Point(i, j)
{
w=k; h=l;
}
void fun(Point &s)
{
cout< }
void main()
{
Rectangle rec(3.0, 5.2, 15.0, 25.0);
fun(rec);
}
该措施的运行功效为:
0
输出功效表白在fun()函数中,s所引用的工具执行的Area()操纵被关联到Point::Area()的实现代码上。这是因为静态联编的功效。在措施编译阶段,对s所引用的工具所执行的Area()操纵只能束定到Point类的函数上。因此,导致措施输出了所不期望的功效。因为我们期望的是s引用的工具所执行的Area()操纵应该束定到Rectangl类的Area()函数上。这是静态联编所达不到的。
动态联编
从对静态联编的上述阐明中可以知道,编译措施在编译阶段并不能确切知道将要挪用的函数,只有在措施执行时才气确定将要挪用的函数,为此要确切知道该挪用的函数,要求联编事情要在措施运行时举办,这种在措施运行时举办联编事情被称为动态联编,或称动态束定,又叫晚期联编。
动态联编实际上是进动作态识别。在上例中,前面阐明过了静态联编时,fun()函数中s所引用的工具被束定到Point类上。而在运行时进动作态联编将把s的工具引用束定到Rectangle类上。可见,同一个工具引用s,在差异阶段被束定的类工具将是差异的。那么如何来确定是静态联编照旧动态联编呢?C++划定动态联编是在虚函数的支持下实现的。
从上述阐明可以看出静态联编和动态联编也都是属于多态性的,它们是差异阶段对差异实现举办差异的选择。上例中,实现上是对fun()函数参数的多态性的选择。该函数的参数是一个类的工具引用,静态联编和动态联编和动态联编实际上是在选择它的静态范例和动态范例。联编是对这个引用的多态性的选择。