本文研究单继承情况下,c++对象的虚函数表的具体情况。
假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。
测试的代码如下:
#include<iostream> using namespace std; class A { public: virtual void fun1() { cout<<"A::fun1"<<endl; } }; class B:public A { public: virtual void fun2() { cout<<"B::fun2"<<endl; } virtual void fun1() { cout<<"B::fun1"<<endl; } }; typedef void (*Fun)(void); int main(int argc, char* argv[]) { B b; cout<<"虚函数表指针的地址为:"<<(int *)(&b)<<endl; cout<<"虚函数表的地址为:"<<*(int *)(&b)<<endl; cout<<"第一个虚函数fun1的地址为:"<<(int *) *(int *)(&b)<<endl; Fun fun1=( Fun) ( *(int *) *(int *)(&b)); fun1(); cout<<"第二个虚函数fun2的地址为:"<< (int *) ((int *) (*(int *)(&b))+1) << endl; Fun fun2=(Fun) (* ((int *) (*(int *)(&b))+1)); fun2(); return 0; }
运行结果:
虚函数表指针的地址为:0xbfa9a77c 虚函数表的地址为:134515592 第一个虚函数fun1的地址为:0x8048b88 B::fun1 第二个虚函数fun2的地址为:0x8048b8c B::fun2
测试代码说明:
虚函数表指针 (int *)(&b)
虚函数表地址 *(int *)(&b)
虚函数表的第一个元素,也就是指向fun1的指针 (int * )(*(int *)(&b))
虚函数表的第二个元素,也就是指向fun2的指针 (int * )(*(int *)(&b)) + 1)
在这种单继承的情况下,如果有虚函数表,那么只有一个虚函数表,并且按照虚函数声明的顺序顺序排列,派生类的虚函数紧接着基类的虚函数排列,类B的虚函数表结果如下图所示:
原文链接: https://www.cnblogs.com/hehehaha/p/6332349.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/128357
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!