C++中的静态联编和动态联编介绍

C++中的静态联编和动态联编介绍,第1张

C++中的静态联编和动态联编介绍,第2张

链接是指计算机程序本身相互关联的过程。根据绑定的不同阶段,有静态绑定和动态绑定两种不同的绑定方式。

静态绑定

静态绑定是指发生在编译连接阶段的绑定工作,也叫早期绑定,因为这个绑定过程是在程序开始运行之前完成的。

编译期间的这种绑定也称为静态绑定。在编译时,解决了程序中操作调用与操作码执行之间的关系。确定这种关系也叫捆绑,编译时捆绑也叫静态捆绑。下面是一个静态绑定的例子。

#包括

class Point
{
public:
Point(double I,double j){ x = I;y = j;}
double Area()const { return 0.0;}
private:
double x,y;
};
类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()
{
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()函数参数的多态性。这个函数的参数是一个类的对象引用,静态绑定和动态绑定和动态绑定实际上是在选择它的静态类型和动态类型。绑定是对这个引用的多态性的选择。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++中的静态联编和动态联编介绍

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情