多态:当不同的对象去完成同一件事时会产生出不同的状态。
多态分为静态多态和动态多态,这里讲的是动态多态。
即动态多态的函数地址晚绑定,运行阶段确定函数地址。
多态示例:
#include<iostream>
//动态多态满足条件
//1、有继承关系
//2、子类重写父类的虚函数
//动态多态的使用
//父类的指针或者引用 指向子类对象
//Animal &animal =cat
//*原理
using namespace std;
class Animal
{
public:
virtual void speak(){
cout<<"动物在说话"<<endl;
}
};
class Cat:public Animal
{
void speak(){
cout<<"小猫在说话"<<endl;
}
};
class Dog:public Animal
{
void speak(){
cout<<"小狗在说话"<<endl;
}
};
void dospeak(Animal &animal){
animal.speak();
}
void test01(){
Cat cat;
Dog dog;
dospeak(cat);
dospeak(dog);
}
int main(){
test01();
return 0;
}
多态原理:
由于用了虚函数,使得类的内部发生了改变,多了一个虚函数指针
vfptr 即 virtual function pointer 虚函数指针(指针四个字节)
虚函数指针指向虚函数表vftable 表内部记录虚函数的地址
当子类没有重写虚函数时,子类把父类继承,vftable中记录的是还是父类的函数
当子类重写父类的虚函数,子类中的虚函数表内部会替换成 子类的虚函数地址
当父类的指针或者引用指向子类对象的时候,发生多态
多态作为C++面向对象三大特性之一
多态的优点:
代码组织结构清晰
可读性强
利于前期和后期的扩展以及维护,如果想扩展新的功能,不需要修改源码。
在真实开发中,对扩展进行开放,对修改进行关闭
参考:黑马程序员和C++ primer