一、多态
所谓多态,就是“多种形态”。
在面向对象的方法中一般是这样描述多态的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。多态性的表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数。
1.静态多态
#include <iostream>
using namespace std;
int Add(int x, int y)
{
return x + y;
}
float Add(float x, float y)
{
return x + y;
}
int main()
{
cout << Add(2, 3) << endl;
cout << Add(2.3f, 3.4f) << endl;
return 0;
}
运行结果如下:
静态多态是通过函数重载实现的。由函数重载和运算符重载形成的多态性属于静态多态,要求编译器在程序编译时就知道调用函数的全部信息。静态多态性又称编译时的多态性。静态多态性的函数调用速度快,效率高,但缺乏灵活性,在程序运行前就已经决定了执行的函数和方法。
2.动态多态
C++中虚函数的主要作用就是实现动态多态。简单说父类的指针/引用调用重写的虚函数,当父类指针/引用指向父类对象时调用的是父类的虚函数,指向子类对象时调用的是子类的虚函数。
虚函数:类的成员函数前面加上virtual关键字,则这个成员函数称为虚函数。
虚函数的重写:当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(覆盖)了父类的这个虚函数。
可以看到:当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中的不同类的对象,从而调用其中的同名函数。
注意:由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数做出不同的响应。动态多态性的特点是:不在编译时确定是哪个函数,而是在程序运行过程中动态的确定操作所针对的对象,它又称运行时多态性。
虚析构函数:
先看如下代码
程序并没有执行派生类的析构函数。如果希望能够执行派生类的析构函数,可以将基类的析构函数声明为虚函数。