静态联编
- 静态联编支持的多态性,我们将其称为编译时的多态性,又称为静态的多态性。
- 静态联编是在程序开始执行之前进行的。即在编译,连接的过程中,系统可以根据类型匹配等特征确定在什么地方调用什么函数。
- 那么可见,编译时的多态性可以通过函数重载来实现。函数重载的意义在于它可以用同一个名字访问一组相关的函数,能使用户为某一类操作取一个通用的名字。编译程序在编译时决定选择具体的函数段执行,这种方式也利于解决程序的复杂性。静态联编函数调用速度快,效率高,但是编程不灵活。
- C++中通过两种工作方式实现编译的多态性:函数重载和运算符重载。它们都属于静态联编。
- 分析该程序的运行结果可知,由于程序中完成的是静态联编,在程序编译阶段,基类指针p对于area方法的调用只能绑定到基类的area方法上,虽然程序运行时p指向了不同的派生类对象,但绑定已在编译阶段完成,所以无论运行时p指向什么类型的对象,始终调用的都是基类中的area方法。有时候这种联编方式输出的结果可能并不是我们期望的结果。
- 关于类型兼容原则,在实际应用时应注意以下几个方面:
(1).基类的指针可以指向它的公有派生类对象,但是不允许指向它的私有或保护派生类的对象。
(2).派生类的指针不允许指向它基类的对象。
(3).基类的指针指向它的公有派生类对象时,只能用它来直接访问派生类中从基类继承的成员,而不能直接访问公有派生类中定义的新成员。
#include <iostream>
using namespace std;
//静态联编示例
class Shape{
int x;
int y;
public:
Shape(int px,int py):x(px),y(py)
{
cout<<"construct Shape"<<endl;
}
float area()
{
return 0;
}
};
class Rectangle:public Shape{
int w;
int h;
public:
Rectangle(int px,int py,int pw,int ph):Shape(px,py),w(pw),h(ph)
{
cout<<"construct Rectangle"<<endl;
}
float area()
{
return w*h;
}
};
class Circle:public Shape{
int r;
public:
Circle(int px,int py,int pr):Shape(px,py),r(pr)
{
cout<<"construct Circle"<<endl;
}
float area()
{
return 3.14*r*r;
}
};
int main()
{
Rectangle a(30,40,4,8);
Circle b(30,40,4);
Shape *p=&a;
cout<<a.area()<<endl;
cout<<p->area()<<endl;
p=&b;
cout<<b.area()<<endl;
cout<<p->area()<<endl;
return 0;
}
运行结果: