版权声明:个人爱好,可随便转载 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; 时,只根据兼容性规则检查它的合理性,即检查是否可以将派生类的地址赋给基类指针。