1.C++里的多态,是如何实现的呢?
C++是通过虚函数来实现动态多态的。动态多态的核心程序运行时才根据对象的实际类型确定调用那个类的成员函数。它的实现原理是对每一包含虚函数的对象分配一个虚函数指针,这个虚函数指针指向一个放在常量区的虚函数。在运行时运行到某个虚函数时,根据这个虚函数指针来找到对应的虚函数的表,然后根据对应的这个函数的下标值在虚函数表中找到对应的函数来完成调用,从而实现动态多态。
2.虚函数内存布局相关
2.1一个类有几个虚函数表?一个类的对象有几个虚函数指针?
一般情况下:一个类只有一张虚函数表,每个类对象有一个虚函数指针指向同一张虚函数表表。
特殊情况下:一个类继承了几个父类,就有几张虚函数表。一个表有几个虚函数表,一个类的对象就有几个虚函数指针。
2.2一个类对象的虚函数指针在类对象的内存布局?
虚函数表指针存放在类对象的首地址。
类继承了多个父类,类对象的虚函数指针按照继承父类的顺序,从对象的首地址开始依次分布。
2.3给你一种情况单继承 /多继承/菱形继承有覆盖,无覆盖情况下的虚函数表中的函数如何排列的?
1.虚函数按照其声明顺序放在表中。
2.单继承中:父类的虚函数在子类的虚函数前面,依次按照声明顺序排列,,共同形成一张表。
3.多继承中,子类的虚表和第一个继承的父类合并形成一张表,剩下的父类单独形成一个虚函数表。
4.子类继承几个父类,就有几个虚函数表,,也就是有几个虚函数表指针,虚函数表的指针在内存中的布局按照继承的父类的顺序排布。第一个虚函数表指针位于对象的首地址。
5.子类中,如果有和父类相同的虚函数,会对父类的虚函数表进行覆盖。
2.4 虚函数表放在哪里?
虚函数表存放在常量区
3.除了动态多态,还有什么样的多态?
静态多态:重载和模板
模板的声明和实现能否放在.h和.cpp中分开实现?
参考:b站骑猪撞宝马71