大佬教程收集整理的这篇文章主要介绍了c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <iostream> #include <stdio.h> using namespace std; typedef void (*fun_pointer)(void); class Test { public: test() { cout<<"test()."<<endl; } virtual void print() { cout<<"Test::Virtual void print()."<<endl; } virtual void print2() { cout<<"Test::Virtual void print2()."<<endl; } }; class TestDrived:public Test { public: TestDrived() { cout<<"TestDrived()."<<endl; } virtual void print() { cout<<"TestDrived::virtual void print()."<<endl; } virtual void print2() { cout<<"TestDrived::virutual void print2()."<<endl; } void GetVtblAddress() { cout<<"vtbl address:"<<(int*)this<<endl; } void GetFirstVtblFunctionAddress(void) { cout<<"First function address in vtbl:"<< (int*)*(int*)this+0; } void GetSecondVtblFunctionAddress(void) { cout<<"First function address in vtbl:"<< (int*)*(int*)this+2<<endl; //my os is 64bit //linux,if you use 32bit OS,please replace the "this+2" with "this+1" } void CallFirstVtblFunction() { fun = (fun_pointer)* ( (int*)*(int*)this+0 ); fun(); } void CallSecondVtblFunction() { fun = (fun_pointer)* ( (int*)*(int*)this+2 ); //my os is 64bit //linux,please replace the "this+2" with "this+1" fun(); } private: fun_pointer fun; }; int main() { cout<<"sizeof(int):"<<sizeof(int)<<"sizeof(int*)"<<endl<<sizeof(int*)<<endl; fun_pointer fun = NULL; TestDrived a; a.GetVtblAddress(); a.GetFirstVtblFunctionAddress(); a.GetSecondVtblFunctionAddress(); a.CallFirstVtblFunction(); a.CallSecondVtblFunction(); return 0; }
以上是大佬教程为你收集整理的c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?全部内容,希望文章能够帮你解决c – 哪个段是存储在ELF文件,数据段或其他中的虚拟表?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。