凡夫佳佳的瞎说

佳佳编程记
posts - 4, comments - 1, trackbacks - 0, articles - 10
//联编是指一个电脑程式自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
//静态联编
//静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程式开始运行之前完成的。
//在编译时所进行的这种联编又称静态束定。在编译时就解决了程式中的操作调用和执行该操作代码间的关系,确定这种关系又称为束定,
//在编译时束定又称静态束定。下面举一个静态联编的例子。
#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()函数参数的多态性的选择。该函数的参数是个类的对象引用,静态联编和动态联编和动态联编实际上
//是在选择他的静态类型和动态类型。联编是对这个引用的多态性的选择。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理