C++虚函数

xiaoxiao2021-02-28  69

今天难得花上一会时间来认真记录一下许久前读的《深度探索C++对象模型》的感悟,编译器搞了什么手脚我们都可以从这本书上得到~

如:

class A { public: virtual func1(){cout<<"this is func1"<<endl} virtual func2(){cout<<"this is func2"<<endl;} virtual func3(){cout<<"this is func3"<<endl;} }

为了提高C++效率,一般的编译器会把vptr放在类的最前端,极少数极少数老旧编译器有放在后端的可能,但目前主流全是放在前端,明白vptr,我们就可以搞事了。&a就是vptr,再转化为int*,再取vptr指向的地址,再强转int* 就是虚表的地址,有了虚表的地址后,+1或者再+2等等些就是在虚表内的第一个或者第二个地址值了。原理算不上高深。至于虚表的操作,编译器在编译期即完成表里的地址信息

void main() { A a; &a//就是a的地址 (int*)(&a);//强转为int*,虚指针地址 *(int*)(&a);//取虚指针所指向的地址即虚表地址 (int*)*(int*)(&a);//强转int*,虚表地址,func1地址 (int*)*(int*)(&a)+1;//虚表第二个地址了,func2地址 (int*)*(int*)(&a)+2;//虚表的第三个地址了,func3地址 //如何通过地址调用他们呢? typedef void (*FUN)(); FUN fun; fun=((FUN)(int*)*(int*)(&a)); fun(); //okay,成功打印出"this is func1" }

该类没有使用虚析函数,本人在测试中使用虚析后,虚表的0号和1号位被使用了,其中有一个存放的虚析地址,第一项存放的是type_info,这个type_info主要是用于判断类型,上转,下转是否可行!

更多文章:http://blog.csdn.net/what951006?viewmode=list pwoered by:小乌龟在大乌龟背上

转载请注明原文地址: https://www.6miu.com/read-27704.html

最新回复(0)