多态是c++面向对象三大特性之一(封装、继承、多态)
分为静态多态和动态多态
静态多态:函数重载和运算符重载就属于静态多态,重用函数名
动态多态:派生类和虚函数实现运行时的多态
区别:
静态多态函数地址早绑定,在编译阶段就确定
动态多态函数地址晚绑定,在运行阶段才确定
利用代码实现如下:
#includeusing namespace std; class Animal { public: virtual void speak() //动态多态的使用条件:1、要有继承关系, //子类要重写父类的虚函数,注意是重写不是重载,需要返回值类型、函数名、参数列表完全一致! { cout<<"动物在说话 !"< 剖析一下原理!!!!!!!!!!!!!!!
当我没用虚函数的时候,Animal类的大小是1,用了之后是8,本质上是函数结构发生了改变,
多了一个vfptr,(虚函数(表)指针),指向的是一个vftable(虚函数表),表里存放的是Animal类的speak函数的地址,(&Animal::speak)
当子类继承父类时,也会继承这一切,如果子类重写了父类的虚函数,那么虚函数表里的子类的speak函数地址将覆盖父类的speak函数地址
此时就实现了用父类的指针或引用去指向子类对象,调用的就是子类的speak函数了此处的原理如果大家还不清楚建议去看看黑马讲的,很清楚,图我放着了:



