联编程序
Ⅰ 联编的静态联编
静态联编又称静态束定、早期联编、前期联编。
静态联编是指联编工作是在程序编译连接阶段进行的,静态联编又称早期联编,因为这种联编是在程序开始运行之前完成的。在程序编译阶段进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又被称为束定,编译时束定又称为静态束定。 #include<iostream.h>classpoint{private:floatx,y;public:voidsetPoint(floatI,floatj){x=I;y=j;}floatarea(){return0;}};constfloatpi=3.14159;classcircle:publicpoint{private:floatradius;public:voidsetRadius(floatr){radius=r;}floatarea(){returnpi*radius*radius;}};voidmian(){pointp;floata=p.area();//调用point类的成员函数cout<<theareaofthepointpis<<a<<endl;circlec;c.setRadius(2.5);a=c.area();//调用circle类的成员函数cout<<theareaofthecirclecis<<a<<endl;}程序结果为:
the area of the point p is 0
the area of the circle c is 19.634937
这就是静态联编,编译器在程序运行前就知道什么函数做什么事。
Ⅱ c++动态联编 静态联编
静态联编
静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程序开始运行之前完成的。
在编译时所进行的这种联编又称静态束定。在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#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()函数参数的多态性的选择。该函数的参数是一个类的对象引用,静态联编和动态联编和动态联编实际上是在选择它的静态类型和动态类型。联编是对这个引用的多态性的选择。
Ⅲ c++中怎么理解动态联编和静态联编
转一个西部数码的:
联编是指一个电脑程式自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。
静态联编
静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程式开始运行之前完成的。
在编译时所进行的这种联编又称静态束定。在编译时就解决了程式中的操作调用和执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。
#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()函数参数的多态性的选择。该函数的参数是个类的对象引用,静态联编和动态联编和动态联编实际上是在选择他的静态类型和动态类型。联编是对这个引用的多态性的选择。
Ⅳ c++里面什么时候用到动态联编(绑定),什么时候用到静态联编
联编是指一个计算机程序自身彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。 静态联编 静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程序开始运行之前完成的。 在编译时所进行的这种联编又称静态束定。在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。下面举一个静态联编的例子。 #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()函数参数的多态性的选择。该函数的参数是一个类的对象引用,静态联编和动态联编和动态联编实际上是在选择它的静态类型和动态类型。联编是对这个引用的多态性的选择。
Ⅳ 浅谈静态联编和动态联编的区别和实现动态联编的
联编是指一个程序自身彼此关联的过程。按照联编所进行的阶段不同,可分为静态联编和动态联编。
静态联编又称静态绑定,指在调用同名函数(即重载函数)时编译器将根据调用时所使用的实参在编译时就确定下来应该调用的函数实现。它是在程序编译连接阶段进行联编的,这种联编又称为早期联编,这是因为这种联编工作是在程序运行之前完成的。它的优点是速度快,效率高,但灵活性不够。
编译时所进行的联编又称为静态束定。束定是指确定所调用的函数与执行该函数代码之间的关系。
动态联编也称动态绑定,是指在程序运行时,根据当时的情况来确定调用的同名函数的实现,实际上就是在运行时选择虚函数的实现。这种联编又称为晚期联编或动态(束定。实现条件:①要有继承性且要求创建子类型关系;)②要有虚函数;③通过基类的对象指针或引用访问虚函数。继承是动态联编的基础,虚函数是动态联编的关键,虚函数经过派生之后,在类族中就可以实现运行过程中的多态。动态联编要求在运行时解决程序中的函数调用与执行该函数代码间的关系,调用虚函数的对象是在运行时确定的。对于同一个对象的引用,采用不同的联编方式将会被联编到不同类的对象上。即不同联编可以选择不同的实现,这便是多态性。它的优点是灵活性强,但效率较低。
Ⅵ 在程序运行阶段完成的联编称为什么 什么可以实现这种联编。
动态联编
编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。
动态联编必须包括以下方面:
成员函数必须声明为virtual
如果基类中声明了为虚函数,则派生类中不必再声明。
调用方式:
通过对象的指针或引用调用成员函数;或通过成员函数调用,反之就无法实现动态联编。