大家好,我是苏貝,本篇博客带大家了解C++的多态,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
4. 多态的原理
4.1 虚函数表
问:下面代码的结果是什么?
答案是8,为什么?类Base里只有1个int类型的变量,它占4个字节,结果是8,那说明还有4个字节是因为虚函数存在的,是什么?看下图
通过观察测试我们发现b对象中除了_b成员,还多一个__vfptr放在对象的前面(注意有些 平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。
一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。那么派生类中这个表放了些什么呢?我们接着往下分
虚函数表里存放的是虚函数的地址
我们再来多一些虚函数
通过观察和测试,我们发现了以下几点问题:
1、 派生类对象d中也有一个虚表指针,d对象由两部分构成,一部分是父类继承下来的成员,父类的虚表指针也继承了,另一部分是自己的成员
2、 基类b对象和派生类d对象虚表是不一样的,这里我们发现Func1完成了重写,所以d的虚表中存的是重写的Derive::Func1,所以虚函数的重写也叫作覆盖,覆盖就是指虚表中虚函数的覆盖。重写是语法的叫法,覆盖是原理层的叫法。
3、 另外Func2继承下来后是虚函数,所以放进了虚表,Func3也继承下来了,但是不是虚函数,所以不会放进虚表
4、 虚函数表本质是一个存虚函数指针的指针数组,一般情况这个数组最后面放了一个nullptr。
总结一下派生类的虚表生成:
- 先将基类中的虚表内容拷贝一份到派生类虚表中
- 如果派生类重写了基类中某