静态联遍
C++支持两种多态性,即编译时的多态性和运行时的多态性。前者是指编译结束后,程序就知道了具体调用哪个函数,例如知道调用父类的函数还是调用子类的函数。后者是直到运行时,程序才知道该调用父类的函数还是子类中重载的该函数。前者叫做静态联遍,后者就叫做动态联遍。看一个例子:
#include <iostream>
using namespace std;
class Rectangle
{
public:
//构造函数
Rectangle(double a,double b){h=a;w=b;}
double area(){return h\*w;}
private:
double h,w;
};
class Circle:public Rectangle
{
public:
//构造函数
Circle(double a,double b,double c):Rectangle(a,b){r=c;}
double area(){return 3.14\*r\*r;}
private:
double r;
};
void func(Rectangle &rec)
{
cout<<rec.area()<<endl;
}
void main()
{
Rectangle r1(2,3);
Circle c1(4,5,1);
func(r1);
func(c1);
}
上面父类Rectangle,有宽w、高h两个数据成员,还有一个算面积的成员函数。子类Circle继承自父类Rectangle,并且有自己的新的数据成员半径r,并重定义了算面积的函数。还有一个不属于任何类的函数func,接收Rectangle对象的引用,输出面积。
在main函数中,定义Rectangle对象r1,Circle对象c1,并依次作为函数func的参数进行调用,输出为:
6
20
对于第一行输出没有疑问,长乘以宽。对于二行,我们理想的情况是调用Circle类重定义的函数func,却仍调用的是父类的func实现。这是因为静态联遍,在编译完之后,程序就确定了要去执行Rectangle类的area函数。