静态联编和动态联编的差异

版权声明:个人爱好,可随便转载 https://blog.csdn.net/qq_43528087/article/details/89010903

静态联编:

  在编译阶段将函数实现和函数调用绑定起来称为静态联编,C语言中,所有联编都是静态联编,C++ 一般情况下也是静态联编

举例:代码如下

#include <iostream>
using namespace std;

class Point//Point表示平面上的点
{
	public:
	    Point(double x1 = 0, double y1 = 0) :x(x1), y(y1){}//构造函数
	    double area(){ return 0; }//计算面积
	private:
	    double x, y;//坐标值
};
class Circle :public Point//Circle类表示圆
{
	public:
	    Circle(double x, double y, double r1) :Point(x, y), r(r1){}
	    double area() { return 3.14*r*r; } //计算面积
	private:
	    double r;
};
int main()
{
	Point a(2.5, 2.5);
	Circle c(2.5, 2.5, 1);
	cout << "Point area=" << a.area() << endl; //基类对象
	cout << "Circle area=" << c.area() << endl;//派生类对象
	Point *pc = &c, &rc = c;//基类指针、引用指向或引用派生类对象
	cout << "Circle area=" << pc->area() << endl;//静态联编基类调用
	cout << "Circle area=" << rc.area() << endl; //静态联编基类调用

	system("pause");
	return 0;
}

在这里插入图片描述
由编译运行结果可得,此为静态联编,调用了基类对象而非指针指向的或引用的派生类对象

动态联编

  在程序运行时才进行函数实现和函数调用绑定起来称为动态联编
举例:代码如下

#include <iostream>
using namespace std;

class Point//Point表示平面上的点
{
	public:
	    Point(double x1 = 0, double y1 = 0) :x(x1), y(y1){}//构造函数
	    virtual double area(){ return 0; }//计算面积
	private:
	    double x, y;//坐标值
};
class Circle :public Point//Circle类表示圆
{
	public:
	    Circle(double x, double y, double r1) :Point(x, y), r(r1){}
	    double area() { return 3.14*r*r; } //计算面积
	private:
	    double r;
};
int main()
{
	Point a(2.5, 2.5);
	Circle c(2.5, 2.5, 1);
	cout << "Point area=" << a.area() << endl;   //基类对象
	cout << "Circle area=" << c.area() << endl;  //派生类对象
	Point  *p = &a;//基类指针指向基类对象
	cout << "Circle area=" << p->area() << endl;
	p = &c;        //基类指针指向派生类对象
	cout << "Circle area=" << p->area() << endl; //动态联编

	system("pause");
	return 0;
}

在这里插入图片描述
在编译 Point *p = &c; 时,只根据兼容性规则检查它的合理性,即检查是否可以将派生类的地址赋给基类指针。

猜你喜欢

转载自blog.csdn.net/qq_43528087/article/details/89010903