Posted on 2009-01-13 20:17
天天向上 阅读(212)
评论(0) 编辑 收藏 引用 所属分类:
编程日记 、
资源共享 、
疑难问题
//联编是指一个电脑程式自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
//静态联编
//静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程式开始运行之前完成的。
//在编译时所进行的这种联编又称静态束定。在编译时就解决了程式中的操作调用和执行该操作代码间的关系,确定这种关系又称为束定,
//在编译时束定又称静态束定。下面举一个静态联编的例子。
#include <cstdlib>
#include <iostream>
using namespace std;
class Point{
private:
double x,y;
public:
Point(double i,double j){x=i;y=j;}
double Area() const {return 0.0;}
};
class Rectangle:public Point{
private:
double w,h;
public:
Rectangle(double i,double j,double k,double l):Point(i,j){
w=k;
h=l;
}
double Area() const {return w*h;}
};
void fun(Point &s){
cout<<s.Area()<<endl;
}
int main(int argc, char *argv[])
{
Rectangle rec(3.0,5.2,15.0,25.0);
fun(rec);
system("PAUSE");
system("PAUSE");
system("PAUSE");
system("PAUSE");
system("PAUSE");
system("PAUSE");
getchar();
return EXIT_SUCCESS;
}
//该程式的运行结果为:0
//输出结果表明在fun()函数中,s所引用的对象执行的Area()操作被关联到Point::Area()的实现代码上。
//这是因为静态联编的结果。在程式编译阶段,对s所引用的对象所执行的Area()操作只能束定到Point类的函数上。
//因此,导致程式输出了所不期望的结果。因为我们期望的是s引用的对象所执行的Area()操作应该束定到Rectangl类的Area()函数上。
//这是静态联编所达不到的。
//【动态联编】
//从对静态联编的上述分析中能够知道,编译程式在编译阶段并不能确切知道将要调用的函数,只有在程式执行时才能确定将要调用的函数,
//为此要确切知道该调用的函数,需要联编工作要在程式运行时进行,这种在程式运行时进行联编工作被称为动态联编,或称动态束定,
//又叫晚期联编。
//动态联编实际上是进行动态识别。在上例中,前面分析过了静态联编时,fun()函数中s所引用的对象被束定到Point类上。
//而在运行时进行动态联编将把s的对象引用束定到Rectangle类上。可见,同一个对象引用s,在不同阶段被束定的类对象将是不同的。
//那么如何来确定是静态联编还是动态联编呢?C 规定动态联编是在虚函数的支持下实现的。
//从上述分析能够看出静态联编和动态联编也都是属于多态性的,他们是不同阶段对不同实现进行不同的选择。上例中,
//实际上是对fun()函数参数的多态性的选择。该函数的参数是个类的对象引用,静态联编和动态联编和动态联编实际上
//是在选择他的静态类型和动态类型。联编是对这个引用的多态性的选择。