gdb打印对象虚函数指针
示例代码:Derive继承Base
1 | #include <iostream> |
通过gdb调试,设置断点后运行到断点位置,打印对象内存信息。
1 | ubuntu@ubuntu-ThinkCentre-M800t-1N000:~$ g++ virtual.cpp -o a.out -g |
通过gdb打印可以看出,将派生类对象地址赋给基类指针,打印基类指针指向的对象内存,可以看到基类指针指向的对象内存中保存的vfptr虚函数表指针,该vfptr虚函数表指针会指向该对象类型的虚函数表,即指向派生类的虚函数表。
静态绑定和动态绑定
这里的绑定,指的是函数调用。静态绑定指编译时期函数的调用就是确定的;动态绑定指函数的调用要到运行时期才能确定,动态绑定是实现OOP语言多态调用的技术基础。
类中出现虚函数,编译阶段会给该类型产生虚函数表,里面存放了虚函数的地址和RTTI指针
有虚函数的类实例化的对象,内存都多了一个vfptr虚函数表指针,指向该对象类型的虚函数表,同类型对象都有自己的vfptr,但是它们共享一个vftable。
基类指针调用派生类的同名覆盖方法时,发生了动态绑定,访问了基类指针指向对象的虚函数表vftable