定义
编译时多态: 在程序编译过程中出现,发生在模板和函数重载中(泛型编程)。
运行时多态: 在程序运行过程中出现,发生在继承体系中,是指通过基类的指针或引用访问派生类中的虚函数。
本文主要讲解运行时的多态:
多态就是不同继承类的对象,对同一消息做出的不同响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现形式。
构成多态的条件:
- 在基类的函数前加上 virtual 关键字,在派生类中重写该函数;
- 调用函数的对象必须是指针或引用。
运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
实现
多态是通过虚函数实现的,虚函数的首地址存在虚函数表中,虚函数表的地址存在含有虚函数的类的实例对象的内存空间中。
实现过程:
- 在类中用 virtual 关键字声明虚函数;
- 存在虚函数的类都有一个虚函数表,当创建该类一个对象时,会生成一个指向虚函数表的虚表指针(虚函数表对应类,虚表指针对应对象)。
- 当基类指针指向派生类的对象时,基类指针调用虚函数时,基类指针指向派生类的虚表指针,由于该虚表指针指向派生类的虚函数表,在表中遍历查找相应的虚函数。
继承和多态
继承:程序向上总结
将子类共同的行为和属性集中写到父类中,通过继承,所有子类都能自动获得这些属性和行为,大大减少了重复代码。
继承成为多态实现的基础。
多态:程序向下扩展
父类某些行为,子类进行继承重写,从而实现:同种行为,不同的实现。