前言
本文主要介绍了C++中多态的基本知识
4.7.1:多态的基本概念和原理剖析
1:基本概念
静态多态:函数重载、运算符重载
动态多态:派生类和虚函数实现运行时多态
静态多态在编译阶段确定函数地址;动态多态在运行阶段确定函数地址
父类类型的引用指向子类的对象,地址早绑定,在编译阶段确定函数地址
子类类型的引用是不能接收父类的对象
如果想执行Cat的speak函数,要进行晚绑定,运行时在确定函数地址,使用虚函数可以实现
多态的条件
1:要有父子继承关系
2:子类要重写父类的虚函数
注意:重载和重写虚函数是不同的。重载是函数名相同,参数的个数、类型、顺序不同;而重写虚函数,函数的名字、参数列表、返回值类型都不能发生改变,只是重新写函数体内的内容
多态的使用情况:父类的指针或引用指向子类的对象
2:原理剖析(vfptr、vftable,父类、子类函数地址都相同?)
vfptr虚函数指针指向的是虚函数在vftable虚函数表的入口地址。如果子类没有重写父类的虚函数,那么子类的vfptr虚函数指针依然指向的是子类从父类中继承的虚函数表,但是虚函数的内容和父类中的是一致的。使用父类的引用去接收子类的对象时,调用的还是父类的虚函数
没有重写父类虚函数时
如果重写了虚函数后,子类的虚函数表内的虚函数就是子类重写过后的函数,执行的内容就是子类重写的内容了,而不是父类中虚函数的内容了
子类中如果出现和父类重名的函数,那么子类对象直接调用该函数会执行子类函数中的内容
黑马B站C++教程理解
当子类没有重写父类的虚函数时,子类的vftable虚函数表记录的是父类虚函数的地址;当子类对父类中的虚函数进行重写之后,子类的vftable虚函数表记录的是子类重写过后的函数地址