c++多态
多态存在的前提是有类的继承。
当存在多个子类继承自父类时,这几个类都会有继承得来(同名的)的函数,调用函数时,根据具体调用的对象的不同来决定执行这几个同名函数中的哪一个的功能称为多态。
看一个未使用多态的反例:
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// 程序的主函数
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存储矩形的地址
shape = &rec;
// 调用矩形的求面积函数 area
shape->area();
// 存储三角形的地址
shape = &tri;
// 调用三角形的求面积函数 area
shape->area();
return 0;
}
这段程序的输出是:
Parent class area
Parent class area
编译器将函数area()设置成了基类中的版本,函数的调用在程序执行之前就准备好了,area()函数在程序编译期间就已经设置好了。这是早绑定(Early binding)/静态绑定(Static binding)/编译时绑定(Compile-time binding)造成的结果,也称静态链接/静态多态 : 函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的