16. 虚函数静态绑定动态绑定
Posted 为了财务自由!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16. 虚函数静态绑定动态绑定相关的知识,希望对你有一定的参考价值。
改一波(改成虚函数):
总结一:
如果类里面定义了虚函数,那么在编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是==RTTI指针和虚函数的地址!==当程序运行时每一张虚函数表都会加载到内存的.rodata区!(只读数据区)
RTTI:run-time type information 运行时的类型信息。
此时虚函数表是Base,所以Base vftable的RTTI指针指向代表“Base”这个字符串!
上述代码加了虚函数关键字之后,sizeof大小变成了8字节,因为多了一个虚函数指针!
总结二:
一个类里面定义了虚函数,那么这个类定义的对象,其运行时,内存开始部分,多存储一个vfptr虚函数指针,指向相应类型的虚函数vftable,一个类型定义的的n个对象,他们的vfptr指向的都是同一张虚函数表!
总结三:
一个类里面的虚函数的个数,不影响对象内存的大小,影响的是虚函数表的大小(多存虚函数的地址!)
总结四:
如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数!
派生类也产生虚函数表!
由于是继承过来的虚函数表,所以是:
但是呢,编译器发现派生类对于show( )方法进行重写了(覆盖),所以:
覆盖指的是:虚函数地址的覆盖!
pb->show()做了什么?
调用这个函数时,并不是直接调用基类的show,因为基类的show是个虚函数,所以访问派生类的虚函数表,执行的是Derive::show();pb->show(int)干了什么呢?调用这个函数时,发现在基类中也是个虚函数,那么就访问指向的对象(派生类对象)的虚函数表,执行相关函数。由于派生类对这个show(int)没有重写,所以虚函数表继承自基类,所以Base::show(int)也就没有变化,执行的是这个Base::show(int)!
以上是关于16. 虚函数静态绑定动态绑定的主要内容,如果未能解决你的问题,请参考以下文章
C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表
C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表